欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文解密C++中的多態(tài)機制

 更新時間:2023年07月31日 14:07:33   作者:Aomnitrix  
眾所周知C++語言的三大特性:封裝、多態(tài)、繼承,其中多態(tài)就是去完成某個行為,但是會根據(jù)不同的對象產(chǎn)生不同的狀態(tài),下面小編就來帶大家深入了解一下C++的多態(tài)機制吧

一.多態(tài)

1.多態(tài)的用處

眾所周知C++語言的三大特性:封裝、多態(tài)、繼承。其中多態(tài)就是去完成某個行為,但是會根據(jù)不同的對象產(chǎn)生不同的狀態(tài),所以叫多態(tài)。

2.多態(tài)的實現(xiàn)

在繼承中實現(xiàn)多態(tài)還需要兩個條件:

1.使用基類的指針或者引用來調(diào)用虛函數(shù)

2.必須在派生類對虛函數(shù)進行重寫

代碼演示如下:

class A
{
public:
	virtual void func()
	{
		cout << "A::func()" << endl;
	}
};
class B : public A
{
public:
	void func()
	{
		cout << "B::func()" << endl;
	}
};
int main()
{
	B b;
	A& a = b;
	a.func();
	return 0;
}

3.虛函數(shù)

用virtual修飾的類成員函數(shù)叫做虛函數(shù),雖然與虛擬繼承用的是同一關鍵字但是兩者并無關聯(lián)。

virtual void func(){cout << "A::func()" << endl;}

派生類的重寫:

重寫需要在派生類中編寫與基類相同的虛函數(shù):返回類型相同(協(xié)變除外)、函數(shù)名相同、參數(shù)相同(缺省值可不同),然后函數(shù)具體實現(xiàn)的不同,來完成多態(tài)。

協(xié)變

協(xié)變允許基類派生類虛函數(shù)的返回值不同,但是要求返回值是互為父/子類的指針或者引用。如下所示:

class A
{
public:
	A(int a = 1)
		:_a(a) {}
	virtual A* func(int val = 0)
	{
		cout << val<< endl;
		return new A;
	}
private:
	int _a;
};
class B : public A
{
public:
	B(int b = 1)
		:_b(b) {}
	virtual B* func(int val = 1)
	{
		cout << val<< endl;
		return new B;
	}
private:
	int _b;
};
int main()
{
	B b;
	A& a = b;
	a.func();
	return 0;
}

上圖中,如果返回的不是本身自己父子類的指針/引用,則可以交換順序!需要注意的是在派生類重寫基類的虛函數(shù)可以不加virtual

析構函數(shù)的重寫

如果基類重寫的析構函數(shù),在派生類可以不加virtual也可以完成重寫(因為編譯器將析構函數(shù)的名稱統(tǒng)一處理成destructor。)

4.override 和 final

這兩個關鍵字都是C++11的新語法,final修飾虛函數(shù) 使得虛函數(shù)不可以重寫。

override 可以在派生類函數(shù)檢查是否重寫的基類虛函數(shù),如果沒有就 報錯

如果不想類被繼承可以采用:將構造函數(shù)設為私有、將類用final修飾為最終類

5.重載重寫與重定義

重載:兩個函數(shù)在同一作用域、函數(shù)名/參數(shù)相同

重寫:兩個函數(shù)分別在基類和派生類的作用域、函數(shù)名/參數(shù)/返回值都必須相同(協(xié)變例外)、兩個函數(shù)必須是虛函數(shù)

隱藏(重定義)兩個函數(shù)分別在基類和派生類的作用域、函數(shù)名相同、兩個基類和派生類的同名函數(shù)不構成重寫就是重定義

6.虛函數(shù)表

如果在類中定義了虛函數(shù),那么類中就會有個虛表用來存放虛表指針。

虛函數(shù)表本質(zhì)是一個存虛函數(shù)指針的指針數(shù)組

虛表中存放著虛函數(shù),同類型對象會共用一塊虛表。

子類自己的虛函數(shù)只會放到第一個父類的虛表后面,其他父類的虛表不需要存儲,因為存儲了也不能調(diào)用

有虛函數(shù)的類前4/8字節(jié)存儲的是虛表的地址。

去虛表找 看是什么對象 (多態(tài)時)

虛函數(shù)重寫只重寫函數(shù)的實現(xiàn) 缺省值會使用父類的

到此這篇關于一文解密C++中的多態(tài)機制的文章就介紹到這了,更多相關C++多態(tài)機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ Qt開發(fā)之CheckBox多選框組件的用法詳解

    C++ Qt開發(fā)之CheckBox多選框組件的用法詳解

    Qt是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹CheckBox單行輸入框組件的使用方法,需要的朋友可以參考下
    2023-12-12
  • C++OOP對象和類的詳細講解

    C++OOP對象和類的詳細講解

    這篇文章主要介紹了C++面相對象編程中的類與對象的特性與概念,OOP面向對象語言相對C語言這樣面相過程的語言來說具有類和對象以及方法這樣的特性,需要的朋友可以參考下
    2021-08-08
  • Qt實現(xiàn)指針式時鐘 Qt實現(xiàn)動態(tài)時鐘

    Qt實現(xiàn)指針式時鐘 Qt實現(xiàn)動態(tài)時鐘

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)指針式時鐘,Qt實現(xiàn)動態(tài)時鐘,兩者相互切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++語言 STL容器list總結

    C++語言 STL容器list總結

    這篇文章主要介紹了C++語言 STL容器list總結的相關資料,需要的朋友可以參考下
    2016-10-10
  • C++編程中的命名空間基本知識講解

    C++編程中的命名空間基本知識講解

    這篇文章主要介紹了C++編程中的命名空間基本知識講解,包括對C++11中內(nèi)聯(lián)命名空間新特性的介紹,需要的朋友可以參考下
    2016-01-01
  • Eclipse對printf()不能輸出到控制臺的快速解決方法

    Eclipse對printf()不能輸出到控制臺的快速解決方法

    Eclipse對printf()不能輸出到控制臺的快速解決方法。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 解析C++編程中如何使用設計模式中的狀態(tài)模式結構

    解析C++編程中如何使用設計模式中的狀態(tài)模式結構

    這篇文章主要介紹了如何在C++編程中適用設計模式中的狀態(tài)模式結構,狀態(tài)模式強調(diào)將特定狀態(tài)相關的邏輯分散到一些類的狀態(tài)類中,需要的朋友可以參考下
    2016-03-03
  • C語言實現(xiàn)猜數(shù)字小游戲

    C語言實現(xiàn)猜數(shù)字小游戲

    這篇文章主要介紹了C語言實現(xiàn)猜數(shù)字小游戲,附有詳細代碼,需要的小伙伴可以參考一下,希望對你的遼西有所幫助
    2021-10-10
  • Qt實現(xiàn)生成指定范圍內(nèi)隨機數(shù)與隨機字符串

    Qt實現(xiàn)生成指定范圍內(nèi)隨機數(shù)與隨機字符串

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)生成指定范圍內(nèi)隨機數(shù)與隨機字符串,文中的示例代碼簡潔易懂,感興趣的小伙伴可以自己動手嘗試一下
    2023-07-07
  • C++基于socket編程實現(xiàn)聊天室功能

    C++基于socket編程實現(xiàn)聊天室功能

    這篇文章主要介紹了C++基于socket編程實現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論