1.多繼承
多繼承是指一個子類繼承多個父類。多繼承對父類的個數沒有限制,繼承方式可以是公共繼承、保護繼承和私有繼承,
不寫繼承方式,默認是private繼承
多繼承舉例:
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
* 定義工人類: Worker
* 數據成員: m_strName
* 成員函數: work()
*/
class Worker
{
public:
Worker(string name)
{
m_strName = name;
cout << "Worker" << endl;
}
virtual ~Worker()
{
cout << "~Worker" << endl;
}
void work()
{
cout << m_strName << endl;
cout << "work" << endl;
}
protected:
string m_strName;
};
/**
* 定義兒童類: Children
* 數據成員: m_iAge
* 成員函數: play()
*/
class Children
{
public:
Children(int age)
{
m_iAge = age;
cout << "Children" << endl;
}
~Children()
{
cout << "~Children" << endl;
}
void play()
{
cout << m_iAge << endl;
cout << "play" << endl;
}
protected:
int m_iAge;
};
/**
* 定義童工類: ChildLabourer
* 公有繼承工人類和兒童類
*/
class ChildLabourer :public Worker,public Children
{
public:
ChildLabourer(string name, int age):Worker(name),Children(age)
{
cout << "ChildLabourer" << endl;
}
~ChildLabourer()
{
cout << "~ChildLabourer" << endl;
}
};
int main(void)
{
// 使用new關鍵字創建童工類對象
Worker * p = new ChildLabourer("jack",14);
// 通過童工對象調用父類的work()和play()方法
p->work();
// p->play();
// 釋放
delete p;
p = NULL;
return 0;
}
輸出結果:
Worker Children ChildLabourer jack work ~ChildLabourer ~Children ~Worker
由輸出結果可以看出,在多繼承中,任何父類的指針都可以指向子類的對象,在實例化子類時,先根據繼承的順序依次調用父類的構造函數,然后再調用該子類自己的構造函數;
用delete銷毀該基類對象時,如果該基類的析構函數不是虛析構函數,且該基類的繼承順序在第一個,如上面的Worker類,(class ChildLabourer :public Worker,public Children)那么delete 父類的時候只會調用父類Worker的析構函數,系統不會出錯,但是如果繼承的時候順序不是在第一位(class ChildLabourer :public Children,public Worker),就會報內存泄露的錯誤,如下圖所示,如果父類的析構函數是虛析構函數,那么銷毀的時候會先調用子類的析構函數再調用所有父類的析構函數,注意,此時,子類的父類的析構函數都會被調用!!!

2.多重繼承
多重繼承特點總結如下:
(1)多重繼承與多繼承不同,當B類從A類派生,C類從B類派生,此時稱為多重繼承
(1)當實例化子類時,會首先依次調用所有基類的構造函數,最后調用該子類的構造函數;銷毀該子類時,則相反,先調用該子類的析構函數,再依次調用所有基類的析構函數。
(2)無論繼承的層級有多少層,只要它們保持着直接或間接的繼承關系,那么子類都可以與其直接父類或間接父類構成 is a的關系,並且能夠通過父類的指針對直接子類或間接子類進行相應的操作,子類對象可以給直接父類或間接父類的對象或引用賦值或初始化。