#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{ //無virtualpublic: 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{ //無virtualpublic: 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 繼承為避免多繼承時子類產生多副本而產生。