C++ 多態(tài)性虛函數(shù)和動(dòng)態(tài)綁定學(xué)習(xí)筆記
C++ 多態(tài)性
C++中的多態(tài)性通過(guò)虛函數(shù)和動(dòng)態(tài)綁定來(lái)實(shí)現(xiàn), 下面簡(jiǎn)單介紹一下多態(tài)的實(shí)現(xiàn):
- 虛函數(shù):在基類(lèi)中聲明虛函數(shù),通過(guò)在成員函數(shù)前面加上
virtual關(guān)鍵字來(lái)標(biāo)識(shí)。虛函數(shù)允許子類(lèi)對(duì)其進(jìn)行重寫(xiě)(覆蓋),從而實(shí)現(xiàn)多態(tài)。基類(lèi)中的虛函數(shù)只有函數(shù)聲明,沒(méi)有具體的實(shí)現(xiàn)。 - 動(dòng)態(tài)綁定:基于對(duì)象的類(lèi)型來(lái)選擇調(diào)用的函數(shù),而不是基于指針或引用的類(lèi)型。在編譯時(shí),編譯器會(huì)根據(jù)指針或引用的靜態(tài)類(lèi)型進(jìn)行函數(shù)調(diào)用;而在運(yùn)行時(shí),根據(jù)指針或引用所指向的對(duì)象的實(shí)際類(lèi)型來(lái)決定調(diào)用哪個(gè)函數(shù)。這種在運(yùn)行時(shí)確定調(diào)用的函數(shù)稱(chēng)為動(dòng)態(tài)綁定。
- 虛函數(shù)表(vtable):編譯器會(huì)為每一個(gè)包含虛函數(shù)的類(lèi)生成一個(gè)虛函數(shù)表,該表存儲(chǔ)了虛函數(shù)的地址。對(duì)象的內(nèi)存布局中會(huì)包含一個(gè)指向虛函數(shù)表的指針,稱(chēng)為虛函數(shù)指針(vptr)。虛函數(shù)指針指向當(dāng)前對(duì)象的虛函數(shù)表,通過(guò)虛函數(shù)表來(lái)找到具體的虛函數(shù)地址。
- 多態(tài)調(diào)用過(guò)程:當(dāng)通過(guò)指針或引用調(diào)用虛函數(shù)時(shí),首先會(huì)根據(jù)指針或引用的靜態(tài)類(lèi)型找到對(duì)應(yīng)的虛函數(shù)表,然后根據(jù)虛函數(shù)表中的偏移量找到具體的虛函數(shù)地址,最終調(diào)用對(duì)應(yīng)的函數(shù)。
示例代碼
class Animal {
public:
virtual void sound() {
std::cout << "動(dòng)物能叫" << std::endl;
}
};
class Dog : public Animal {
public:
void sound() override {
std::cout << "Dog's voice sounds like Wangwang." << std::endl;
}
};
class Cat : public Animal {
public:
void sound() override {
std::cout << "Cat's voice sounds like Miaomiao." << std::endl;
}
};
int main() {
Animal* animalPtr;
Dog dog;
Cat cat;
animalPtr = &dog;
animalPtr->sound(); // 輸出: Dog's voice sounds like Wangwang.
animalPtr = &cat;
animalPtr->sound(); // 輸出: Cat's voice sounds like Miaomiao.
return 0;
}在上述示例中,Animal類(lèi)是基類(lèi),Dog和Cat類(lèi)分別是派生類(lèi)。它們都重寫(xiě)(覆蓋)了基類(lèi)的sound函數(shù)。通過(guò)基類(lèi)指針animalPtr指向不同的派生類(lèi)對(duì)象,并調(diào)用sound函數(shù)。在運(yùn)行時(shí),根據(jù)指針?biāo)赶虻膶?duì)象的實(shí)際類(lèi)型來(lái)選擇調(diào)用哪個(gè)函數(shù),實(shí)現(xiàn)了多態(tài)性。
總之,C++中的多態(tài)通過(guò)虛函數(shù)和動(dòng)態(tài)綁定來(lái)實(shí)現(xiàn)。虛函數(shù)允許子類(lèi)對(duì)其進(jìn)行重寫(xiě),動(dòng)態(tài)綁定根據(jù)對(duì)象的實(shí)際類(lèi)型來(lái)確定調(diào)用哪個(gè)函數(shù)。使用虛函數(shù)表和虛函數(shù)指針來(lái)實(shí)現(xiàn)動(dòng)態(tài)綁定。這種機(jī)制能夠提供更靈活的代碼設(shè)計(jì)和對(duì)象行為的多樣性。
以上就是C++ 多態(tài)性虛函數(shù)和動(dòng)態(tài)綁定學(xué)習(xí)筆記的詳細(xì)內(nèi)容,更多關(guān)于C++ 多態(tài)虛函數(shù)動(dòng)態(tài)綁定的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 關(guān)于C++虛函數(shù)與靜態(tài)、動(dòng)態(tài)綁定的問(wèn)題
- C++實(shí)現(xiàn)動(dòng)態(tài)綁定代碼分享
- 深入理解C++的動(dòng)態(tài)綁定與靜態(tài)綁定的應(yīng)用詳解
- 詳解C++動(dòng)態(tài)內(nèi)存管理
- C++內(nèi)存管理面經(jīng)
- 詳解C++中動(dòng)態(tài)內(nèi)存管理和泛型編程
- C++圖文并茂分析講解內(nèi)存管理
- 一文詳解C++中動(dòng)態(tài)內(nèi)存管理
- C語(yǔ)言與C++中內(nèi)存管理詳解
- 一起來(lái)學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理
- C++中動(dòng)態(tài)綁定和內(nèi)存管理的實(shí)現(xiàn)
相關(guān)文章
C語(yǔ)言中常用的幾個(gè)頭文件及庫(kù)函數(shù)
這篇文章主要介紹了C語(yǔ)言中常用的幾個(gè)頭文件及庫(kù)函數(shù)的相關(guān)資料,需要的朋友可以參考下2017-09-09
淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr
雖然通過(guò)弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預(yù)見(jiàn)會(huì)出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說(shuō)這個(gè)僅僅是一種編譯期的解決方案,如果程序在運(yùn)行過(guò)程中出現(xiàn)了循環(huán)引用,還是會(huì)造成內(nèi)存泄漏的2013-09-09
解決 VSCode 編寫(xiě) C++11 代碼報(bào)紅問(wèn)題分析
今天在寫(xiě) C++ 代碼的時(shí)候用上 C++11 的特性,然后發(fā)現(xiàn) VSCode 雖然可以編譯通過(guò),但是會(huì)在相應(yīng)位置報(bào)紅,這是怎么回事呢?下面小編給大家?guī)?lái)了解決方法,一起看看吧2021-09-09
opengl實(shí)現(xiàn)任意兩點(diǎn)間畫(huà)圓柱體
這篇文章主要為大家詳細(xì)介紹了opengl實(shí)現(xiàn)任意兩點(diǎn)間畫(huà)圓柱體,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
詳解C語(yǔ)言解決經(jīng)典問(wèn)題之兔子產(chǎn)子
有一對(duì)兔子,從出生后的第 3 個(gè)月起每個(gè)月都生一對(duì)兔子。小兔子長(zhǎng)到第 3 個(gè)月后每個(gè)月又生一對(duì)兔子,假設(shè)所有的兔子都不死,問(wèn) 30 個(gè)月內(nèi)每個(gè)月的兔子總數(shù)為多少?本文將用C語(yǔ)言解決這一經(jīng)典問(wèn)題,需要的可以參考一下2022-03-03

