C中的结构继承。在类型转换后访问父结构中的成员

C中的结构继承。在类型转换后访问父结构中的成员,c,inheritance,C,Inheritance,在代码中,child被强制转换为typeParent,并传递给parentMovechild没有成员x和y。parentMove如何访问child.parent.x和child.parent.y?这里的类型转换是如何工作的?Thx #include <stdio.h> typedef struct{ int x, y; int (*move)(); }Parent; typedef struct { Parent parent; int h, w;

在代码中,
child
被强制转换为type
Parent
,并传递给
parentMove
child
没有成员
x
y
parentMove
如何访问
child.parent.x
child.parent.y
?这里的类型转换是如何工作的?Thx

#include <stdio.h>

typedef struct{
    int x, y;
    int (*move)();
}Parent;

typedef struct {
    Parent parent;
    int h, w;
}Child;

int parentMove(Parent* parent, int y, int x){
    parent->y+=y;
    parent->x+=x;
    printf("%d %d", parent->y, parent->x);
    return 1;
}

int main(void) {
    Parent parent = {.x = 2, .y = 1, .move = &parentMove};
    Child child = {.parent = parent, .h = 3, .w = 4};
    ((Parent*)(&child))->move((Parent*)&child, 10, 10);
    return 0;
}
#包括
类型定义结构{
int x,y;
int(*move)();
}父母;
类型定义结构{
父母;
int h,w;
}儿童;
int parentMove(父*Parent,int y,int x){
父->y+=y;
父->x+=x;
printf(“%d%d”,父级->y,父级->x);
返回1;
}
内部主(空){
Parent Parent={.x=2.y=1.move=&parentMove};
Child={.parent=parent,.h=3.w=4};
((父*)(&child))->移动((父*)&child,10,10);
返回0;
}
parentMove如何访问child.parent.x和child.parent.y

它不知道孩子的部分。无论父对象是声明为独立对象还是声明为子对象的成员,这两种情况都是一样的

这里的类型转换是如何工作的


糟糕的。。。如果必须从调用方强制转换到基类,则实现继承的方式不正确。似乎
Child
应该实现自己的
move
,将
Child*
作为参数,如果只是将其作为父级的包装。

这里的类型转换是如何工作的?parentMove如何访问Child.parent.x和Child.parent.y?

在子结构中,第一个成员是父结构,因此子结构的内部内存表示是--

当您访问parent.x时,它只访问起始地址(即&parent)的前4个字节。类似地,访问parent.y意味着在从起始地址偏移4个字节之后访问4个字节


因此,当您将子结构的地址作为指向父结构的指针传递时,子地址实际上指向内部的有效父结构成员,从这个意义上说,从子地址访问前4个字节实际上是父结构。x类似地,正确访问包含的父结构的其他成员。

请参阅
&child==&child.parent
而后者是一个
parent*
,这就是强制转换工作的原因。
int(*move)()应该是
int(*move)(父*父,int y,int x),是故意省略的吗?@csavvy我知道它有效,所以我只是故意省略了它。这是个坏习惯though@Austin阿菲克,那是乌布。所以它不起作用。它只是表现得很像。
{
    {
        int x;         [ .. 4bytes .. ]
        int y;         [ .. 4bytes .. ]
        int *move();   [ .. 4bytes .. ]
    }
    int h;             [ .. 4bytes .. ]
    int w;             [ .. 4bytes .. ]
}