首页 > 代码库 > c++, 虚基派生 : 共同基类产生的二义性的解决办法
c++, 虚基派生 : 共同基类产生的二义性的解决办法
虚基派生 //虚继承
#include <iostream>using namespace std;#include <string>//--------------------------------------class A{public: int m_ax ; int m_ay; A(); A(int va,int vy); void show();};A::A(){}A::A(int vx,int vy){ this->m_ax = vx; this->m_ay = vy;}void A::show(){ cout<<"A::show "<<endl; cout<<"A::m_ax = "<<m_ax<<endl; cout<<"A::m_ay = "<<m_ay<<endl;}//--------------------------------------class B1: virtual public A {public: int m_b1x; B1(); B1(int ax,int ay,int bx);};B1::B1(){}B1::B1(int ax,int ay,int b1x){ m_ax = ax; m_ay = ay; m_b1x = b1x;}//---------------------------------------class B2: virtual public A {public: int m_b2x; B2(); B2(int ax,int ay,int b2x);};B2::B2(){}B2::B2(int ax,int ay,int b2x){ m_ax = ax; m_ay = ay; m_b2x = b2x;}//-------------------------------------class C: public B1,public B2 {//虚基继承public: int m_cx; C(); C(int ax,int ay,int b1x,int b2x); void show();};C::C(){}C::C(int ax,int ay,int b1x,int b2x){ m_ax = ax;//因为C的上级B1、B2使用了虚基继承A,所以C类中只有一个m_ax,不会产生二义性。 m_ay = ay; m_b1x = b1x; m_b2x = b2x;}void C::show(){ cout<<"C::show()"<<endl; cout<<"m_ax = "<<m_ax<<endl; cout<<"m_ay = "<<m_ay<<endl; cout<<"m_b1x = "<<m_b1x<<endl; cout<<"m_b2x = "<<m_b2x<<endl;}//--------------------------------------int main(){ C c1(1 ,2 ,3 ,4 ); c1.show(); //C中实现的show c1.A::show(); //从A继承下来的show只有一个,以下面这三种方式访问到的都是同一个A::show() c1.B1::show(); c1.B2::show(); cout<<"addr c1.B1::m_ax = "<<&(c1.B1::m_ax)<<endl;//从A继承下来的m_ax只有一个,这三种方式访问的是同一个m_ax,地址是相同的。 cout<<"addr c1.B2::m_ax = "<<&(c1.B2::m_ax)<<endl; cout<<"addr c1.A::m_ax = "<<&(c1.A::m_ax)<<endl; cout<<"c1.B1::m_ax = "<<c1.B1::m_ax<<endl; cout<<"c1.B2::m_ax = "<<c1.B2::m_ax<<endl; cout<<"c1.A::m_ax = "<<c1.A::m_ax<<endl; B1 b1(22,33,44) ; cout<<"B1.m_ax = "<<b1.m_ax<<endl; b1.show();//B虚继承A ,可以不用重写A的方法而直接使用。 while(1); return 0 ;}// C::show()// m_ax = 1// m_ay = 2// m_b1x = 3// m_b2x = 4// // A::show // A::m_ax = 1// A::m_ay = 2// // A::show // A::m_ax = 1// A::m_ay = 2// // A::show // A::m_ax = 1// A::m_ay = 2// // addr c1.B1::m_ax = 0xbfbb43c8 //因为C的上级B1、B2使用了虚基继承A,所以C类中只有一个m_ax,不会产生二义性。// addr c1.B2::m_ax = 0xbfbb43c8// addr c1.A::m_ax = 0xbfbb43c8// c1.B1::m_ax = 1// c1.B2::m_ax = 1// c1.A::m_ax = 1// // B1.m_ax = 22// A::show // A::m_ax = 22// A::m_ay = 33
参考:华清远见笔记。
c++, 虚基派生 : 共同基类产生的二义性的解决办法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。