为什么这样做?
typedef struct {
data member_x;
} base;
typedef struct {
struct base;
data member_y;
} derived;
void function_on_base(struct base * a);
//这里我可以传递指向派生和基础的指针,我怎么能这样做?
function_on_base怎么能要求时基指针接受派生类型的指针?
答案 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
等语言中。