C++ virtual inherit, 虚基类
#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 继承为避免多继承时子类产生多副本而产生。

浙公网安备 33010602011771号