使用C中的父对象访问子类成员

时间:2014-02-24 22:37:19

标签: c

为什么这样做?

typedef struct {
   data member_x;
} base;

typedef struct {
   struct base;
   data member_y;
} derived;

void function_on_base(struct base * a); //这里我可以传递指向派生和基础的指针,我怎么能这样做?

function_on_base怎么能要求时基指针接受派生类型的指针?

1 个答案:

答案 0 :(得分:2)

它有效,因为在内存中,derived结构可以表示为:

             sizeof(derived)
     sizeof(base)
|-------------------|----------------|

beginning           end of base      end of derived
of derived
AND of base

所以这个:

derived my_derived;
(base)my_derived;

实际上会占用sizeof(base)的{​​{1}}个第一个字节,相当于derived(因为您在base struct结构中的第一个位置声明了它)。 / p>

当你调用你的函数时,隐式投射是在你不知情的情况下完成的,并且只是起作用。您应该使用一些额外的标志进行编译,以避免这些隐式转换。

虽然,此功能主要用于C,因为它允许“重现” OOP 功能,存在于derived等语言中。