c – 多重继承
发布时间:2020-12-16 09:55:08 所属栏目:百科 来源:网络整理
导读:我有2个基类(B1和B2),它们来自公共基类(B),它们有一个公共变量(let:int x;来自基数B),第一个基数x = 0,第二个基数x = 10(B1,B2构造函数中给出的默认值). 视觉: class B{ int x;protected: B(int x) : x{x}{}};class B1 : public B{protected: B1() : B(0){
我有2个基类(B1和B2),它们来自公共基类(B),它们有一个公共变量(let:int x;来自基数B),第一个基数x = 0,第二个基数x = 10(B1,B2构造函数中给出的默认值).
视觉: class B { int x; protected: B(int x) : x{x}{} }; class B1 : public B { protected: B1() : B(0){} }; class B2 : public B { protected: B2() : B(10){} }; 现在,如果我再推导一个类: class D : virtual public B1,virtual public B2 { public: D() : B1{},B2{}{} }; 这里只有一个x副本可用于虚拟概念,现在如果我尝试使用派生类对象访问x值,x的实例将在O / p(x = 0或x = 10)中得到,为什么? 解决方法
为了使用虚拟继承,必须在B1和B2中将基数B声明为虚拟.没有它,你有B的非虚拟继承.
如果你有非虚拟继承,那么你在D中有两个B基,所以你不能在D中访问x而不将其限定为B1 :: x或B2 :: x 如果你有虚拟继承,那么你只有一个B和一个x,所以它的两个赋值(x = 0和x = 10)将按你执行的顺序发生,而后者中的任何一个都将覆盖该值由前一个设置(与具有两个赋值的简单变量x一样). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |