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
被强制转换为typeParent
,并传递给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 .. ]
}