前言
c++ 虚拟继承常见用法
Code
虚拟继承构造函数只初始化一次
#include <iostream>
using namespace std;
class A {
int a;
public:
A(){ cout<<"Constructing A"<<endl; }
};
class B {
public:
B(){ cout<<"Constructing B"<<endl;}
};
class B1:virtual public B ,virtual public A{
public:
B1(int i){ cout<<"Constructing B1"<<endl; }
};
class B2: public A,virtual public B { //虚拟继承构造函数只初始化一次
public:
B2(int j){ cout<<"Constructing B2"<<endl; }
};
class D: public B1, public B2 {
public:
D(int m,int n): B1(m),B2(n){ cout<<"Constructing D"<<endl; }
A a;
};
int main(){
D d(1,2);
return 0;
}
result
Constructing B
Constructing A
Constructing B1
Constructing A
Constructing B2
Constructing A
Constructing D
虚继承
为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。
#include<iostream>
using namespace std;
class A {
public:
void vf() {
cout<<"I come from class A"<<endl; }
};
class B: virtual public A{};
class C: virtual public A{};
class D: public B, public C{};
int main()
{
D d;
d.vf (); // okay
return 0;
}
result
I come from class A