答案 0 :(得分:11)
答案 1 :(得分:2)
struct是一个字节区域内存,编译器知道它的结构,即你在里面声明的变量。
例如,您可以声明一个结构:
struct st {
int number;
};
struct st n;
n.number = 10;
printf("n=%i\n", n.number);
但是你可以改变编译器的行为,例如在你的struct上声明一个指向char的指针:
char *c = (char*)&n;
printf("char c=%c\n", c[0]);
这是一份法律声明。然后你可以随时改变那个记忆区的结构。唯一重要的是你声明的struct的内存地址。
在您的示例中,当声明派生结构时,程序会保留一个内存区域来分配派生结构,但编译器看到此区域的格式可以随时更改:
struct derived my_derived;
struct base *b = (struct base*)&my_derived;
b->x = 20;
my_derived.y = 10;
printf("x=%i y=%i\n", my_derived.base.x, my_derived.y);
在这种情况下,b和& my_derived共享相同的内存区域,您只需更改编译器“看到”此区域的方式。
使用“类型双关语”是C语言中的oop遗产模拟的基础,这是一种非oop编程语言。
我在我的项目中使用这种技术:oop4c
答案 2 :(得分:1)