一 虛函數
增加程序的擴展性
class Parent {
public:
void test() {
cout << "parent" << endl;
}
};
class Child :public Parent {
public:
void test() {
cout << "child" << endl;
}
};
Parent *c = new Child();
// 編譯期間 確定c 爲 parent 調用parent的test方法
c->test();
//修改Parent爲virtual 虛函數 動態鏈接,告訴編譯器不要靜態鏈接到該函數
virtual void test() {
cout << "parent" << endl;
}
//動態多態 調用Child的test方法
c->test();
構造函數任何時候都不可以聲明爲虛函數
析構函數一般都是虛函數,釋放先執行子類再執行父類
二 虛函數引發的內存泄漏:
則在virtualFun函數中通過父類指針操作子類對象的成員函數的時候是沒有問題的,可是在銷燬對象內存的時候則只是執行了父類的析構函數,子類的析構函數卻沒有執行,這會導致內存泄漏
void zipFun() {
//用父類的指針來出事話一個子類的對象
Plane *jet = new Copter();
//調用了子類中的虛函數
jet->land();
//回收
delete jet;
jet = nullptr; //這種情況存在內存泄漏的可能
}
調用後打印:沒有走子類Copter的析構函數
Plane 無參構造函數00905A08灣流1991
Copter 無參構造函數灣流1991
Copter land
Plane 析構函數00905A08灣流1991
解決方法 將Plane 和Copter 的析構函數都聲明爲虛函數(.h聲明中加上virtual關鍵字)
三 純虛函數
//純虛函數
virtual void test() = 0;
- 當一個類具有一個純虛函數,這個類就是抽象類
- 抽象類不能實例化對象
- 子類繼承抽象類,必須要實現純虛函數,如果沒有,子類也是抽象類
- 一個類中只有純虛函數,那麼它是一個接口
- 抽象類的作用:爲了繼承約束,根本不知道未來的實現
class Parent {
public:
//純虛函數 繼承自這個類需要實現 抽象類型
virtual void test() = 0;
};
class Child :public Parent {
public:
void test(){}
};