如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明
的名字进行访问时,可能产生二义性
如果一个派生类从多个基类派生,而这些基类又有一个共同
的基类,则在对该基类中声明的名字进行访问时,可能产生
二义性
如果在多条继承路径上有一个公共的基类,那么在继承路径的某处
汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象
#include <iostream>
using namespace std;
class B
{
private:
/* data */
public:
int b;
B(/* args */);
~B();
};
B::B(/* args */)
{
cout << "sonstruct B" << endl;
}
B::~B()
{
}
class B1 : public B
{
public:
int b1;
};
class B2 : public B
{
public:
int b2;
};
class C : public B1, public B2
{
public:
int c;
};
int main(int argc, char *argv[])
{
C c1;
c1.b1 = 100;
c1.b2 = 200;
c1.c = 300;
// c1.b = 500; //继承的二义性 和 虚继承解决方案
c1.B1::b = 500; //继承的时候基类产生了两个子类对象
c1.B2::b = 500;
cout<<"hello..."<<endl;
return 0;
}
要使这个公共基类在派生类中只产生一个子对象,必须对这个基类
声明为虚继承,使这个基类成为虚基类。
虚继承声明使用关键字 virtual
增加 virtual
关键字之后,基类构造函数其实只调用了一次
#include <iostream>
using namespace std;
class B
{
private:
/* data */
public:
int b;
B(/* args */);
~B();
};
B::B(/* args */)
{
cout << "sonstruct B" << endl;
}
B::~B()
{
}
class B1 : virtual public B
{
public:
int b1;
};
class B2 : virtual public B
{
public:
int b2;
};
class C : public B1, public B2
{
public:
int c;
};
int main(int argc, char *argv[])
{
C c1;
c1.b1 = 100;
c1.b2 = 200;
c1.c = 300;
c1.b = 500; //继承的二义性 和 虚继承解决方案
c1.B1::b = 500;
c1.B2::b = 500;
cout<<"hello..."<<endl;
return 0;
}
执行结果如下:
construct B
hello...