派生類定義與基類同名函數 display(),基類指標指向派生對象調用時,執行的是基類版本。原因:基類函數未聲明 virtual,編譯器進行靜態綁定,根據指標類型 (基類) 決定調用哪個函數。
class Base {
public:
void display() { cout << "Base"; } // 非虛函數
};
class Derived : public Base {
public:
void display() { cout << "Derived"; } // 遮蔽而非覆寫
};
Base* ptr = new Derived();
ptr->display(); // 輸出 "Base" - 靜態綁定
class Base {
public:
virtual void display() { cout << "Base"; } // 動態綁定
};
class Derived : public Base {
public:
void display() override { cout << "Derived"; } // 覆寫
};
Base* ptr = new Derived();
ptr->display(); // 輸出 "Derived" - 多態生效
virtual,執行動態綁定 (看對象實際類型);否則靜態綁定 (看指標聲明類型)。Derived d; d.display(); 調用派生版本。virtual 時派生類同名函數為遮蔽,基類指標無法調用;有 virtual 才是覆寫,支援多態。最佳實務:基類析構函數必須 virtual,任何擬供多態的函數均加 virtual (C++11 建議加 override 防錯)。