參考資料:
http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained
驗證代碼:
#include <iostream> using namespace std; class Base { public: virtual void VirtualFunc() { cout << "Base virtual" << endl; } void NonVirtualFunc() { cout << "Base non-virtual" << endl; } }; class Derived : public Base { public: void VirtualFunc() { cout << "Derived virtual" << endl; } void NonVirtualFunc() { cout << "Derived non-virtual" << endl; } }; int main() { Base base; Derived derived; Base *dPtr = &derived, *bPtr = &base; // Base &dRef = derived, &bRef = base; // 使用引用代替指針也是一樣的效果 dPtr->VirtualFunc(); dPtr->NonVirtualFunc(); bPtr->VirtualFunc(); bPtr->NonVirtualFunc(); return 0; }
1、加了virtual關鍵字,就可以使用polymorphism(多態)的特性(上述代碼已驗證)
2、加了virtual關鍵字,可以在Base就提供implementation,允許生成Base的objects(上述代碼已驗證)
3、加了virtual關鍵字,並加上 "=0",就成為pure virtual,Base不允許提供implementation,因此也就不允許生成Base的objects(嘗試把Base.VirtualFunc改為pure的再編譯,會報錯,即使你提供了implementation也要報錯)
4、Derived繼承了Base,除非提供了implementation,否則繼續保持從Base繼承得來的virtual或者pure virtual特性
總結:
1、virtual本身是用來說明:這個function可以實現polymorphism的特性,僅virtual關鍵字本身並不會導致一個class是abstract的(也就是說就如Base一樣,你可以在Base中定義一個virtual function,但是只要你提供了該function的實現,則Base仍然是可實例化的)。如果一個class有sub-class,那么顯然這個class的destructor必須是virtual的(否則在delete Base-class的pointer的時候可能無法正確的執行到Sub-class的destructor),現在的編譯器一般都會檢測到這個問題並給出warning
2、pure virtual是virtual的特例(也就是說,既提供了polymorphism的特性,還提供了更強的約束性),這個“更強的約束性”體現在哪兒呢?:定義pure virtual function的class不可實例化(例如你把Base.VirtualFunc改為pure的,那么Base就不能生成objects了,哪怕你為VirtualFunc提供了實現也不行,因為編譯器禁止為pure virtual function提供實現);而通過繼承而得到pure virtual function的class在override(重寫,也就是提供該pure virtual function的implementation)該pure virtual function之后可以生成objects,否則繼續保持abstract的特性。pure virtual是用來實現類似於java中的abstract class和interface特性,也就是說pure virtual的存在會導致一個class具有abstract的特性