嵌入式结构和正确的函数调用

你有两个结构。一种是'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 Bnt%sn", 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 *,您将如何保证print_stuff函数在B中被称为)?     
已邀请:
你可以使
print_stuff
成为一个函数指针,但是你需要手动将它连接到正确的函数。但在这种情况下,您只是复制C ++继承机制,因此它毫无意义。
A
对象不能自动知道它包含在哪里,或者它是否包含它。 所以底线是,只使用C ++继承。     
这太可怕了。但是,有一种方法可以做到这一点。将
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 Bnt%sn", 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;
}
    

要回复问题请先登录注册