虛函數解釋:它們是什麼以及它們與純虛函數有何不同
在物件導向程式設計中,虛函數的概念是運行時多態性不可或缺的一部分。虛函數是一種可以在衍生類別中重寫的函數,以在類別層次結構的不同層級提供不同的實作。
虛函數和非虛函數之間的主要區別在於,最派生的版本當虛函數被重寫時,在類別層次結構的所有層級上使用。相較之下,非虛函數的功能在基底類別中保持不變,即使它在衍生類別中被重寫也是如此。
以下範例說明了虛函數的行為:
struct Base { virtual ~Base() = default; virtual void foo() { std::cout << "Base::Foo" << std::endl; } }; struct Derived final: Base { void foo() override { std::cout << "Derived::Foo" << std::endl; } };
執行此程式碼會產生以下輸出:
Base::Foo Derived::Foo Derived::Foo
如您所見,當呼叫foo( ) 函數時在Derived 類別的實例上,即使透過基底類別指標(Base* returned_as_base) 存取實例,也會使用Derived::foo() 實作。
純虛函數:特殊的Case
純虛函數是需要在衍生類別中實現的虛函數。它沒有在基底類別中定義,必須在衍生類別中重寫以使該類別具體化。具有一個或多個純虛函數的類別被認為是抽象的,不能直接實例化。
這是一個純虛函數的範例:
struct Base { virtual ~Base() = default; virtual void foo() = 0; }; struct Derived final: Base { void foo() override { std::cout << "Derived::Foo" << std::endl; } };
在這種情況下,類別 Base 是抽象,因為它包含一個純虛函數 foo()。要使用此類,衍生類別必須實作 foo() 函數,使衍生類別成為可以實例化的具體類別。
總之,虛函數可讓您在不同層級重寫基底類別功能。層次結構,而純虛函數則需要衍生類別來實作特定的功能以使類別具體化。理解這些概念對於在物件導向程式設計中編寫可擴展和多態程式碼至關重要。
以上是虛擬函數與純虛擬函數:有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!