虛函數實現動態多態:基類指針/引用指向派生類對象時,調用虛函數會根據對象真實類型在運行期綁定到正確的函數實現,而非編譯期靜態綁定。
obj->vptr[index](),實現動態分派。class Student { public: void display() { /* ... */ } };
class Graduate : public Student { public: void display() { /* ... */ } };
Student* p = new Graduate;
p->display(); // 輸出 Student::display,因為非虛函數靜態綁定
加上 virtual 後,同樣代碼輸出 Graduate::display。
基類指針 delete 派生類對象時,若析構函數非虛,僅調用基類析構函數,派生類部分資源洩漏。
class Base { public: virtual ~Base() {} }; // 必須 virtual
class Derived : public Base { /* ... */ };
Base* p = new Derived;
delete p; // 正確調用 Derived::~Derived() -> Base::~Base()
規則:基類析構函數一旦聲明 virtual,所有派生類析構函數自動成為虛函數。
class Shape {
public:
virtual void draw() = 0; // 純虛函數
virtual ~Shape() {}
};
Base::func()。this 指針,無法關聯對象。