1. 多重继承
C++ 支持多重继承。所谓的多重继承指的是子类同时继承多个父类,此时子类拥有所有父类的所有成员。
继承方式如下:
class Derived : public Baes_A, public Baes_B
{
...
}
多重继承会造成不同的父类指针(或引用)指向(或引用)子类对象时,实际所指向(或引用)的子类地址不一致。如此一来,假设程序中想通过判断两个指针是否指向相同的对象时,会发生错误的判定导致程序逻辑错误。而这个问题是无解的。因此, C++ 不提倡使用多重继承,C++ 派送出来的如 JAVA、C# 等都不支持多重继承。
- 实验:
class Base_A
{
private:
int mVar;
};
class Base_B
{
private:
int mVar;
};
class Derived : public Base_A, public Base_B
{
private:
int mVar;
};
int main(int argc, char *argv[])
{
Derived obj;
Base_A* p_A = &obj;
Base_B* p_B = &obj;
if(reinterpret_cast<void*>(p_A) == reinterpret_cast<void*>(p_B))
{
cout << "*p_A equal to *p_B" << endl;
}
else
{
cout << "p_A = " << p_A << endl; // p_A = 0x7ffe1e60
cout << "p_B = " << p_B << endl; // p_B = 0x7ffe1e64
}
}
2. 虚继承
在多重继承中,还有一个陷阱,称为菱形继承。所谓的菱形继承通俗描述为,由一个基类派生出派生类 A 与派生类 B,然后派生类 C 再继承于派生类 A 与 B,这样一来便会产生冗余的成员。
- 实验:
class Base
{
public:
void Print()
{
cout << "in Base" << endl;
}
};
class Derived_A :