你有两个结构。一种是'A',另一种是'B'。 类型'B'中的一个具有类型为'A'的结构。所以像这样:
struct A {
void print_stuff(A * a){ puts("From A"); }
};
struct B {
A a_part;
char * s;
void print_stuff(B * b){
printf("From B\n\t%s\n", b->s);
}
};
B * B_new(char * str) {
B * b = (B*)malloc(sizeof(struct B));
b->s = strdup(str);
return b;
}
您希望能够调用struct B的'print_stuff'函数,即使使用以下代码:
A * aptr = (A*) B_new("foo");
aptr->print_stuff(aptr);
不允许使用继承,C ++容器或类。结构B必须有a_part。
如何编写代码,以便无论指针的类型如何,都会调用正确的print_stuff函数(在这种情况下,如果指向类型B的结构的指针被转换为A *,您如何保证B中的print_stuff函数被称为?
答案 0 :(得分:3)
你可以使print_stuff
成为一个函数指针,但是你需要手动将它连接到正确的函数。但在这种情况下,您只是复制C ++继承机制,因此它毫无意义。
A
对象无法自动知道它所包含的位置,或者它是否包含它。
所以底线是,只使用C ++继承。
答案 1 :(得分:0)
这太可怕了。但是,有一种方法可以做到这一点。将bool
字段放在A
中,并放在B
中的相同位置,以指明实际类型。下面的代码应该让您了解C ++(并且实际上不应该用于任何其他目的)。
struct A {
bool isB;
A()
{
isB=false;
}
void print_stuff(A * a);
};
struct B {
bool trueB;
A a_part;
char * s;
B()
{
isB=true;
}
void print_stuff(B * b){
printf("From B\n\t%s\n", b->s);
}
};
void A::print_stuff(A * a)
{
if(isB)
{
B* b = (B*)(this);
b->print_stuff(b);
}
else
puts("From A");
}
B * B_new(char * str) {
B * b = (B*)malloc(sizeof(struct B));
b->s = strdup(str);
b->trueB=true;
return b;
}