#include <iostream> using namespace std; class A{ public: int m_a; A(int a):m_a(a){ cout<<"A 构造"<<endl; } void introA(){ cout<<"m_a:"<<m_a<<endl; } }; class B1:public A{ public: int m_b1; B1(int a,int b1):A(a),m_b1(b1){ cout<<"B1 构造"<<endl; } void introB1(){ cout<<"m_a:"<<m_a<<",m_b1:"<<m_b1<<endl; } void setA_by_b1(int ia){ m_a = ia; } }; class B2:public A{ //无virtual public: int m_b2; B2(int a,int b2):A(a),m_b2(b2){ cout<<"B2 构造"<<endl; } void introB2(){ cout<<"m_a:"<<m_a<<",m_b2:"<<m_b2<<endl; } void setA_by_b2(int ia){ m_a = ia; } }; class C:public B1,public B2{ public : int m_c; C(int a,int b1,int b2,int c):B1(a,b1),B2(a,b2),m_c(c){ //无A的构造 cout<<"C 构造"<<endl; } void introC(){ cout<<"B1::m_a:"<<B1::m_a<<endl //此处有限定符B1:: <<"B2::m_a:"<<B2::m_a<<endl <<",m_b1:"<<m_b1<<",m_b2:"<<m_b2<<",m_c:"<<m_c<<endl; } }; class D:public C{ public : int m_d; D(int a,int b1,int b2,int c,int d):C(a,b1,b2,c),m_d(d){ //无A的构造 cout<<"D 构造"<<endl; } void introC(){ cout<<"B1::m_a:"<<B1::m_a<<endl //此处有限定符B1:: <<"B2::m_a:"<<B2::m_a<<endl <<",m_b1:"<<m_b1<<",m_b2:"<<m_b2<<",m_c:"<<m_c<<endl <<",m_d:"<<m_d<<endl; } }; int main() { //A a(1); //a.introA(); cout<<"*****************************"<<endl; D c(1,21,22,3,4); cout<<"*****************************"<<endl; c.introC(); cout<<"*****************************"<<endl; c.setA_by_b1(10); c.setA_by_b2(11); c.introC(); cout<<"*****************************"<<endl; return 0; }
输出结果为:
*****************************
A 构造
B1 构造
A 构造
B2 构造
C 构造
D 构造
*****************************
B1::m_a:1
B2::m_a:1
,m_b1:21,m_b2:22,m_c:3
,m_d:4
*****************************
B1::m_a:10
B2::m_a:11
,m_b1:21,m_b2:22,m_c:3
,m_d:4
*****************************
从以上看出,d对象含 有两份类A成员的副本。
再将程序改为virtual public 继承
#include <iostream> using namespace std; class A{ public: int m_a; A(int a):m_a(a){ cout<<"A 构造"<<endl; } void introA(){ cout<<"m_a:"<<m_a<<endl; } }; class B1:virtual public A{ public: int m_b1; B1(int a,int b1):A(a),m_b1(b1){ cout<<"B1 构造"<<endl; } void introB1(){ cout<<"m_a:"<<m_a<<",m_b1:"<<m_b1<<endl; } void setA_by_b1(int ia){ m_a = ia; } }; class B2:virtual public A{ //无virtual public: int m_b2; B2(int a,int b2):A(a),m_b2(b2){ cout<<"B2 构造"<<endl; } void introB2(){ cout<<"m_a:"<<m_a<<",m_b2:"<<m_b2<<endl; } void setA_by_b2(int ia){ m_a = ia; } }; class C:public B1,public B2{ public : int m_c; C(int a,int b1,int b2,int c):A(a),B1(a,b1),B2(a,b2),m_c(c){ //有A的构造 cout<<"C 构造"<<endl; } void introC(){ cout<<"B1::m_a:"<<B1::m_a<<endl //此处有限定符B1:: <<"B2::m_a:"<<B2::m_a<<endl <<",m_b1:"<<m_b1<<",m_b2:"<<m_b2<<",m_c:"<<m_c<<endl; } }; class D:public C{ public : int m_d; D(int a,int b1,int b2,int c,int d):A(a),C(a,b1,b2,c),m_d(d){ //有A的构造 cout<<"D 构造"<<endl; } void introC(){ cout<<"B1::m_a:"<<B1::m_a<<endl //此处有限定符B1:: <<"B2::m_a:"<<B2::m_a<<endl <<",m_b1:"<<m_b1<<",m_b2:"<<m_b2<<",m_c:"<<m_c<<endl <<",m_d:"<<m_d<<endl; } }; int main() { //A a(1); //a.introA(); cout<<"*****************************"<<endl; D c(1,21,22,3,4); cout<<"*****************************"<<endl; c.introC(); cout<<"*****************************"<<endl; c.setA_by_b1(10); c.setA_by_b2(11); c.introC(); cout<<"*****************************"<<endl; return 0; }
输出结果为:
*****************************
A 构造
B1 构造
B2 构造
C 构造
D 构造
*****************************
B1::m_a:1
B2::m_a:1
,m_b1:21,m_b2:22,m_c:3
,m_d:4
*****************************
B1::m_a:11
B2::m_a:11
,m_b1:21,m_b2:22,m_c:3
,m_d:4
*****************************
从上可以看出,d中只有一个A的副本。
结语:virtual 继承为避免多继承时子类产生多副本而产生。
原文链接: https://www.cnblogs.com/wucg/archive/2012/03/23/2413034.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/44931
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!