天天看點

C++基礎學習(六)繼承和派生

1 派生類定義格式:

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

2 繼承方式

C++基礎學習(六)繼承和派生

總結:

繼承方式 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;
}
           
C++基礎學習(六)繼承和派生
#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;
}
           
C++基礎學習(六)繼承和派生

繼續閱讀