为了账号安全,请及时绑定邮箱和手机立即绑定

虚拟继承如何解决“钻石”(多重继承)歧义?

虚拟继承如何解决“钻石”(多重继承)歧义?

C++ C
慕姐8265434 2019-08-26 14:49:06
虚拟继承如何解决“钻石”(多重继承)歧义?class A                     { public: void eat(){ cout<<"A";} }; class B: virtual public A   { public: void eat(){ cout<<"B";} }; class C: virtual public A   { public: void eat(){ cout<<"C";} }; class D: public         B,C { public: void eat(){ cout<<"D";} }; int main(){     A *a = new D();     a->eat(); } 我理解钻石问题,上面的代码没有那个问题。虚拟继承究竟是如何解决问题的?我的理解: 当我说A *a = new D();,编译器想要知道类型的对象是否D可以分配给类型的指针A,但它有两个可以遵循的路径,但不能自己决定。那么,虚拟继承如何解决问题(帮助编译器做出决定)?
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

派生类的实例“包含”基类的实例,因此它们在内存中看起来像这样:

class A: [A fields]class B: [A fields | B fields]class C: [A fields | C fields]

因此,如果没有虚拟继承,D类的实例将如下所示:

class D: [A fields | B fields | A fields | C fields | D fields]
          '- derived from B -' '- derived from C -'

因此,请注意A数据的两个“副本”。虚拟继承意味着内部派生类在运行时设置了一个vtable指针,指向基类的数据,因此B,C和D类的实例如下所示:

class B: [A fields | B fields]
          ^---------- pointer to Aclass C: [A fields | C fields]
          ^---------- pointer to Aclass D: [A fields | B fields | C fields | D fields]
          ^---------- pointer to B::A          ^--------------------- pointer to C::A


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信