看一个菱形继承的例子:
家具类
/ \
/ \
沙发 床
\ /
\ /
沙发床
#include <iostream> #include <string> using namespace std; class CFurniture { public: CFurniture() { cout << "CFurniture()\r\n"; m_nFurniture = 0; } void use() {}; int m_nFurniture; }; class CSofa:public CFurniture { public: CSofa() { m_nSofa = 1; cout << "CSofa()\r\n"; } ~CSofa() { cout << "~CSofa()\r\n"; } void sit() { cout << "sit()\r\n"; } private: int m_nSofa; }; class CBed:public CFurniture { public: CBed() { m_nBed = 2; cout << "CBed()\r\n"; } ~CBed() { cout << "~CBed()\r\n"; } void sleep() { cout << "sleep()\r\n"; } private: int m_nBed; }; //构造新类,既有sofa特点,又有bed的特点--->多重继承 class CSofaBed :public CSofa, public CBed { public: CSofaBed() { cout << "CSofaBed()\r\n"; } ~CSofaBed() { cout << "~CSofaBed()\r\n"; } }; int main() { //创建沙发床对象 CSofaBed sofaBed; //调用不明确,sofa和bed中都继承了家具类的m_nFurniture //sofaBed.m_nFurniture = 3; //指定类域(其实sofaBed本应只有一个m_nFurniture变量,但是由于菱形继承造成了这个 //天生的漏洞,因此C++提出了虚继承以规避此问题) sofaBed.CSofa::m_nFurniture = 1; sofaBed.CBed::m_nFurniture = 1; return 0; }
为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。
在继承方式前面加上 virtual 关键字就是虚继承,被共享的基类就是虚基类
class CSofa:virtual public Furniture class CBed:virtual public CFurniture
不提倡在程序中使用多继承,只有在比较简单和不易出现二义性的情况或实在必要时才使用多继承,能用单一继承解决的问题就不要使用多继承。也正是由于这个原因,C++ 之后的很多面向对象的编程语言,例如 Java、C#、PHP 等,都不支持多继承。
原文:https://www.cnblogs.com/y4247464/p/13832527.html