你这里有什么是“穷人的遗产”。像C++中的真正继承一样,它用于定义一个类型,它包含对象的共同特征(数据,函数指针),事实上这些对象可以携带比普通子集更多的信息。
该技术被广泛用于例如GhostScript中的打印机驱动程序携带一些常用信息以及用于控制该特定打印机型号的特殊信息。
这里使用的C语言机制是一个结构本质上是按照成员声明的顺序在内存中连接它的数据,。该订单对于铸造后访问权限很重要。 你B的内存布局是|---int x---|---int d ---|
。没有额外的信息存储。 A *
指向第一个元素x; B *
也是如此。你可以有一个结构c
struct C
{
B b;
float f;
};
其布局将是|---int x---|---int d ---|-----float f---|
。有趣的是,你可以将一个A *pa
传递给一个函数,该函数以某种方式知道pa实际上指向一个C并将其“向下”投射:((C *)pa)->f
。 (C *)pa
不会改变pa的值,只是告诉编译器它指向什么(由程序员负责)。关于什么类型的实际上是隐藏在对象中的知识经常被编码在enum/int数据成员中,该成员在创建对象时手动设置为魔术,类型指示值。
为什么'b'被转换为'A *'?这两种类型似乎是无关的,除了'B'具有'A'类型的成员。据我的理解,赋值'((A *)b) - > x = 10'将取决于具体的内存布局。 – Codor
b-> a.x很容易理解。但另一种格式对我来说并不容易理解。 –
如果我没有弄错,那么这两项任务在结构上完成不同的事情,并且最好偶然地得到相同的结果。 – Codor