1. 概念
A作为基类,B、C继承于A。类D继承于B、C,这样形式的继承称为菱形继承。
2. 示意图
3. 缺点
1)数据冗余:在D中会保存两份A的内容;
2)访问不明确(二义性):因为D不知道是以B为中介去访问A还是以C为中介去访问A,因此在访问某些成员的时候会发生二义性;
4. 解决方案
1)通过虚继承的方式解决;
2)通过作用域访问符“::”来明确调用;
5. 示例
class ProductA
{
public:
ProductA(int a) :m_iNumA(a) {}
int getNum() const { return m_iNumA; }
private:
int m_iNumA;
};
class ProductB : public ProductA
{
public:
ProductB(int a, int b) :ProductA(a), m_iNumB(b) {}
private:
int m_iNumB;
};
class ProductC : public ProductA
{
public:
ProductC(int a, int b) :ProductA(a), m_iNumC(b) {}
private:
int m_iNumC;
};
class ProductD :public ProductB, public ProductC
{
public:
ProductD(int a, int b, int c, int d) : ProductB(a, b), ProductC(a, c), m_iNumD(d) {}
void func()
{
//错误,访问不明确
//cout << getNum()<<endl;
//正确,通过B访问getMa()
cout << ProductB::getNum() << endl;
cout << ProductC::getNum() << endl;
}
private:
int m_iNumD;
};