C++ 多態(tài)性虛函數(shù)和動態(tài)綁定學習筆記
C++ 多態(tài)性
C++中的多態(tài)性通過虛函數(shù)和動態(tài)綁定來實現(xiàn), 下面簡單介紹一下多態(tài)的實現(xiàn):
- 虛函數(shù):在基類中聲明虛函數(shù),通過在成員函數(shù)前面加上
virtual關(guān)鍵字來標識。虛函數(shù)允許子類對其進行重寫(覆蓋),從而實現(xiàn)多態(tài)。基類中的虛函數(shù)只有函數(shù)聲明,沒有具體的實現(xiàn)。 - 動態(tài)綁定:基于對象的類型來選擇調(diào)用的函數(shù),而不是基于指針或引用的類型。在編譯時,編譯器會根據(jù)指針或引用的靜態(tài)類型進行函數(shù)調(diào)用;而在運行時,根據(jù)指針或引用所指向的對象的實際類型來決定調(diào)用哪個函數(shù)。這種在運行時確定調(diào)用的函數(shù)稱為動態(tài)綁定。
- 虛函數(shù)表(vtable):編譯器會為每一個包含虛函數(shù)的類生成一個虛函數(shù)表,該表存儲了虛函數(shù)的地址。對象的內(nèi)存布局中會包含一個指向虛函數(shù)表的指針,稱為虛函數(shù)指針(vptr)。虛函數(shù)指針指向當前對象的虛函數(shù)表,通過虛函數(shù)表來找到具體的虛函數(shù)地址。
- 多態(tài)調(diào)用過程:當通過指針或引用調(diào)用虛函數(shù)時,首先會根據(jù)指針或引用的靜態(tài)類型找到對應(yīng)的虛函數(shù)表,然后根據(jù)虛函數(shù)表中的偏移量找到具體的虛函數(shù)地址,最終調(diào)用對應(yīng)的函數(shù)。
示例代碼
class Animal {
public:
virtual void sound() {
std::cout << "動物能叫" << 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類是基類,Dog和Cat類分別是派生類。它們都重寫(覆蓋)了基類的sound函數(shù)。通過基類指針animalPtr指向不同的派生類對象,并調(diào)用sound函數(shù)。在運行時,根據(jù)指針所指向的對象的實際類型來選擇調(diào)用哪個函數(shù),實現(xiàn)了多態(tài)性。
總之,C++中的多態(tài)通過虛函數(shù)和動態(tài)綁定來實現(xiàn)。虛函數(shù)允許子類對其進行重寫,動態(tài)綁定根據(jù)對象的實際類型來確定調(diào)用哪個函數(shù)。使用虛函數(shù)表和虛函數(shù)指針來實現(xiàn)動態(tài)綁定。這種機制能夠提供更靈活的代碼設(shè)計和對象行為的多樣性。
以上就是C++ 多態(tài)性虛函數(shù)和動態(tài)綁定學習筆記的詳細內(nèi)容,更多關(guān)于C++ 多態(tài)虛函數(shù)動態(tài)綁定的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr
雖然通過弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預見會出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說這個僅僅是一種編譯期的解決方案,如果程序在運行過程中出現(xiàn)了循環(huán)引用,還是會造成內(nèi)存泄漏的2013-09-09

