C 虛擬函數實現多態性,允許衍生類別重寫函數。動態綁定在運行時決定要執行哪個函數,提供靈活性。虛擬函數透過 virtual 關鍵字聲明,允許衍生類別重寫。動態綁定在編譯時無法確定要呼叫哪個函數時發生,提供執行時間靈活性。動物類層次結構範例展示了虛擬函數如何用於根據物件類型呼叫不同的方法。圖形繪製範例說明了動態綁定如何用於根據物件類型動態繪製物件。
C 虛擬函數與動態綁定:解開執行階段類型資訊的秘密
導言
虛擬函數是C 中強大的機制,用於實現多態性,允許擁有不同實現的衍生類別物件透過基底類別指標或參考被呼叫。借助動態綁定,在運行時確定要執行哪個函數,這提供了極大的靈活性。
虛擬函數
宣告為 virtual
的函數是一個虛擬函數,它允許函數在衍生類別中重寫。當透過基底類別指標或引用呼叫虛擬函數時,將呼叫與實際物件類型對應的實作。
動態綁定
動態綁定是在執行時間解析類型和呼叫對應函數的過程。當編譯器不知道在編譯時將呼叫哪個函數實作時,就會發生這種情況。動態綁定允許在程式執行時更改物件的類型,從而實現更大的靈活性。
實戰案例I:動物類別層次結構
考慮以下動物類別層次結構:
class Animal { public: virtual void Speak(); }; class Dog : public Animal { public: virtual void Speak() override; }; class Cat : public Animal { public: virtual void Speak() override; };
每個類別都宣告一個虛擬函數Speak()
,可以在衍生類別中重寫。
void Animal::Speak() { std::cout << "Animal speaks" << std::endl; } void Dog::Speak() { std::cout << "Dog barks" << std::endl; } void Cat::Speak() { std::cout << "Cat meows" << std::endl; }
實戰案例 II:圖形繪製
動態綁定也可以用來實作圖形應用程式中物件的動態繪製。考慮以下範例:
class Shape { public: virtual void Draw(); }; class Rectangle : public Shape { public: void Draw() override; }; class Circle : public Shape { public: void Draw() override; }; void DrawShape(Shape& shape) { shape.Draw(); }
在這個範例中,DrawShape()
函數透過基底類別參考接收一個形狀對象,並呼叫其 Draw()
方法。由於 Draw()
是一個虛擬函數,因此將呼叫與實際物件類型對應的實作。
現在,讓我們建立一些形狀物件並使用 DrawShape()
函數繪製它們:
int main() { Rectangle rectangle; Circle circle; DrawShape(rectangle); // 输出:"Rectangle drawn" DrawShape(circle); // 输出:"Circle drawn" return 0; }
以上是C++ 虛擬函數與動態綁定:探索運行時類型訊息的詳細內容。更多資訊請關注PHP中文網其他相關文章!