#includeusing namespace std; class Animal { public: virtual void enjoy() { // 虛函數啟用多態 cout << "動物叫聲...\n"; } virtual ~Animal() {} // 虛析構函數(關鍵!) }; class Dog : public Animal { public: void enjoy() override { // 覆寫 cout << "汪汪汪...\n"; } }; class Lady { Animal* pet; public: Lady(Animal* a) : pet(a) {} void askEnjoy() { pet->enjoy(); } // 動態綁定:實際調用 Dog::enjoy() }; int main() { Animal* a = new Dog(); // 基類指針指向派生對象 Lady lady(a); lady.askEnjoy(); // 輸出:汪汪汪... delete a; // 正確調用 Dog::~Dog() 再 Animal::~Animal() return 0; }
virtual 關鍵字讓編譯器生成虛函數表(vtable),運行時根據對象真實類型查表調用。delete basePtr 僅調用基類析構,導致派生類資源洩漏(如內存、文件句柄、鎖)。
Animal 对象布局: [vptr] -> Animal::vtable -> { &Animal::enjoy, &Animal::~Animal }
Dog 对象布局: [vptr] -> Dog::vtable -> { &Dog::enjoy, &Dog::~Dog }
基類指針 a 指向 Dog 對象,a->enjoy() 通過 vptr 查表調用 Dog::enjoy。
多態是 C++ 面向對象的核心機制。記住三條鐵律:
override。virtual(有微小性能開銷)。