1 派生類定義格式:
class 派生類:繼承方式 基類名
{
//派生類新增的資料成員和成員函數
}
2 繼承方式

總結:
繼承方式 | public | protected | private |
---|---|---|---|
public | public還是public | protected還是protected | private還是private |
protected | public變成protected | protected還是protected | private還是private |
private | public變成private | protected變成private | private變成private |
3 繼承中的構造和析構順序
(1)子類建立對象時,先調用父類的構造,然後調用自身構造
(2)析構順序與構造順序相反
(3)子類是不會繼承父類的構造函數和析構函數
(4)如果父類中沒有合适預設構造,那麼子類可以利用初始化清單的方式顯示調用父類的其他構造
4 繼承中的同名處理
(1)成員屬性 直接調用先調用子類,如果想調用父類 需要作用域
(2)成員函數 直接調用先調用子類,父類的所有版本都會被隐藏,除非顯示用作用域運算符去調用
5 繼承中靜态成員的處理
(1)類似非靜态成員函數處理
(2)如果想通路父類中的成員,加作用域即可
6 多繼承的概念及問題
(1)class A:public B1,public B2,…
(2)引發二義性問題
(3)想解決二義性問題,就需要通過作用域
7 菱形繼承問題以及解決
問題:
資源浪費
(1)解決問題利用虛基類
(2)sheepTuo内部結構
- vbptr 虛基類指針
- 指向一張 虛基類表
- 通過表找到偏移量
-
找到共有的資料
下面同一個程式來說明:
這裡使用的是:VS 2017的開發人員指令提示符 ,也可以使用其他版本的。
#include <iostream>
using namespace std;
class Animal
{
public:
int m_Age;
};
class Sheep :public Animal
{};
class Tuo :public Animal
{};
class SheepTuo :public Sheep, public Tuo
{};
void test()
{
SheepTuo st;
st.Sheep::m_Age = 10;
st.Tuo::m_Age = 20;
cout << st.Sheep::m_Age << endl;
cout << st.Tuo::m_Age << endl;
}
int main()
{
test();
return EXIT_SUCCESS;
}
#include <iostream>
using namespace std;
class Animal
{
public:
int m_Age;
};
// 虛基類
class Sheep :virtual public Animal
{
};
class Tuo :virtual public Animal
{
};
class SheepTuo :public Sheep, public Tuo
{
};
// 菱形繼承的解決方案 利用虛繼承
// 操作共享一份資料
void test()
{
SheepTuo st;
st.Sheep::m_Age = 10;
st.Tuo::m_Age = 20;
cout << st.Sheep::m_Age << endl;
cout << st.Tuo::m_Age << endl;
cout << st.m_Age << endl; // 可以直接通路,原因已經沒有二義性的可能了,隻有一份m_Age
}
int main()
{
test();
return EXIT_SUCCESS;
}