虛擬函數(shù)允許在派生類(lèi)中覆蓋基類(lèi)函數(shù),在運(yùn)行時(shí)根據(jù)對(duì)象類(lèi)型調(diào)用適當(dāng)函數(shù):創(chuàng)建虛擬函數(shù):基類(lèi)中使用 virtual 關(guān)鍵字聲明函數(shù)。覆蓋虛擬函數(shù):派生類(lèi)中使用 override 關(guān)鍵字覆蓋基類(lèi)虛擬函數(shù)。實(shí)戰(zhàn)調(diào)用:通過(guò)基類(lèi)指針或引用指向派生類(lèi)對(duì)象時(shí),將調(diào)用覆蓋版本。未覆蓋虛擬函數(shù):如果沒(méi)有覆蓋,將調(diào)用基類(lèi)原始實(shí)現(xiàn)。使用指針或引用調(diào)用:實(shí)現(xiàn)多態(tài)性,允許基類(lèi)的指針或引用指向派生類(lèi)對(duì)象,并在運(yùn)行時(shí)調(diào)用適當(dāng)?shù)母采w函數(shù)。
C++ 虛擬函數(shù)實(shí)戰(zhàn)應(yīng)用:代碼示例與解疑
虛擬函數(shù)簡(jiǎn)介
虛擬函數(shù)是 C++ 中一種多態(tài)性機(jī)制。它允許基類(lèi)中的函數(shù)在派生類(lèi)中被覆蓋,允許在運(yùn)行時(shí)根據(jù)對(duì)象的實(shí)際類(lèi)型調(diào)用適當(dāng)?shù)暮瘮?shù)。
創(chuàng)建虛擬函數(shù)
要?jiǎng)?chuàng)建虛擬函數(shù),需要在基類(lèi)中使用 virtual
關(guān)鍵字聲明該函數(shù),如下所示:
class Base { public: virtual void print() { cout << "Base class" << endl; } };
登錄后復(fù)制
覆蓋虛擬函數(shù)
在派生類(lèi)中,可以使用 override
關(guān)鍵字覆蓋基類(lèi)中的虛擬函數(shù),如下所示:
class Derived : public Base { public: override void print() { cout << "Derived class" << endl; } };
登錄后復(fù)制
實(shí)戰(zhàn)案例
考慮以下一個(gè)簡(jiǎn)單的示例:
#include <iostream> using namespace std; class Animal { public: virtual void speak() { cout << "Animal speaks" << endl; } }; class Dog : public Animal { public: override void speak() { cout << "Dog barks" << endl; } }; int main() { Animal* a = new Dog(); a->speak(); // 輸出:Dog barks return 0; }
登錄后復(fù)制
在這個(gè)示例中,基類(lèi) Animal
定義了 speak()
虛擬函數(shù),它在 Dog
派生類(lèi)中被覆蓋。當(dāng)我們通過(guò) Animal*
指針調(diào)用 speak()
函數(shù)時(shí),將調(diào)用覆蓋版本,輸出 “Dog barks”。
解疑
問(wèn):為什么需要使用指針或引用來(lái)調(diào)用虛擬函數(shù)?
答:為了實(shí)現(xiàn)多態(tài)性,基類(lèi)的指針或引用可以指向派生類(lèi)的對(duì)象,允許在運(yùn)行時(shí)調(diào)用適當(dāng)?shù)母采w函數(shù)。
問(wèn):如果在派生類(lèi)中沒(méi)有覆蓋虛擬函數(shù)會(huì)怎么樣?
答:在這種情況下,將調(diào)用基類(lèi)中的原始實(shí)現(xiàn)。