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

虚继承抽象类会咋样

首先先说,我不是那种懒人,我已经用VS试验过了,不过刚突发奇想觉得很有意思,所以想跟大家分享下。

菱形虚继承(远征篇-继承-6.1),最底层实例化时只有一个最高层的副本,比如B和C继承A,D继承B和C,那么实例化D的时候只会实例化一个A的对象。

这节课有一个知识点叫抽象类(含有纯虚函数的类),这就很有意思了,抽象类无法实例化,必须定义继承下来的虚函数才能实例化,那么假设B和C对同一个A中的虚函数fun有不同的实现,那么D同时继承B和C,D又只含有一个A的副本,那么D中的fun到底是B中定义,还是C中定义的呢?

答案是无法编译(虚拟函数 函数 "A::fun" 的重写不明确),只有B和C中有且只有一个fun函数的定义,才可以编译通过,顺利运行。



正在回答

2 回答

这个是可以运行的啊

0 回复 有任何疑惑可以回复我~

能把代码贴出来吗

0 回复 有任何疑惑可以回复我~
#1

没情感的机器人 提问者

代码我都删了……待会回去写一个给你吧
2020-01-10 回复 有任何疑惑可以回复我~
#2

没情感的机器人 提问者

#include <iostream> using namespace std; class A { public: virtual void fun()=0; }; class B :virtual public A{ public: virtual void fun() { cout << "instance B" << endl; } }; class C :virtual public A { public: virtual void fun2() { cout << "instance C" << endl; } };
2020-01-14 回复 有任何疑惑可以回复我~
#3

没情感的机器人 提问者

class D :public B,public C { }; int main() { D d; d.fun(); return 0; } //B或C中删除任意一个fun定义即可通过
2020-01-14 回复 有任何疑惑可以回复我~
#4

Ch_zaqdt 回复 没情感的机器人 提问者

如果B和C中都是fun,那么对于A来说抽象类都被B和C实现了,然后用D去多继承B和C就产生了二义性,想要调用只能是B::fun或者C::fun
2020-01-14 回复 有任何疑惑可以回复我~
查看1条回复

举报

0/150
提交
取消
C++远征之多态篇
  • 参与学习       66234    人
  • 解答问题       314    个

本教程将带领大家体会面向对象三大特性中的多态特性

进入课程

虚继承抽象类会咋样

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信