class A {
public:
A() { cout << "A" << endl; }
virtual ~A() { cout << "~A" << endl; }
};
class B : public A {
public:
B() { cout << "B" << endl; }
~B() { cout << "~B" << endl; }
};
int main() {
A* p = new B; // 關鍵行
delete p;
return 0;
}
輸出:
A
B
~B
~A
關鍵點:由於 A 的解構函數宣告為 virtual,delete p 會正確調用 B::~B() 再調用 A::~A()。若非虛解構函數,僅調用 A::~A() 導致子類資源洩漏。
A* p = new B 而非 A* p = new A?父類指標/引用指向子類物件,是 C++ 實現**執行時多型**的基礎。這允許:
std::vector vec; vec.push_back(new B); vec.push_back(new C);A* createObject(int type) { if(type==1) return new B; ... }例如圖形繪製系統:
class Shape { virtual void draw() = 0; virtual ~Shape() {} };
class Circle : public Shape { void draw() override { ... } };
class Rect : public Shape { void draw() override { ... } };
// 使用端無需知道具體類型
std::vector shapes;
shapes.push_back(new Circle);
shapes.push_back(new Rect);
for (auto s : shapes) s->draw(); // 多型調用
for (auto s : shapes) delete s; // 虛解構確保正確釋放
| 場景 | 說明 |
|---|---|
| 插件架構 | 主程式載入動態庫,僅知基類介面,實例化衍生類 |
| 策略模式 | 執行時切換演算法實現(如排序、壓縮策略) |
| 框架回調 | 框架定義抽象基類,使用者繼承實現具體邏輯 |