c++ virtual 和 pure virtual的區別


參考資料:

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的特性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM