C++ 虛函數與純虛函數的使用與區別
什麼是虛函數:
虛函數 是在基類中使用關鍵字 virtual 聲明的函數,在C++ 語言中虛函數可以繼承,當一個成員函數被聲明為虛函數之後,其派生類中的同名函數都自動生成為虛函數,
虛函數主要體驗C++的多態方面,(多態是參數個數和類型相同而實現功能不同的函數)
為瞭更好的裡面虛函數請看下面的demo
#include <iostream> #include <string> using namespace std; class Aname { public: virtual void function_name() { cout << "Aname調用瞭function_name" << endl; } }; class Bname:public Aname { public: void function_name() { cout << "Bname調用瞭function_name" << endl; } }; int main() { Aname *a = new Bname(); a->function_name(); }
這裡由於類Aname 裡面的function_name 被聲明為虛函數, 所以雖然指針a 指向Aname 卻調用瞭
Bname 裡面的function_name
打印結果為
如果類Aname 裡面的函數沒有聲明虛函數, 是調用A裡面的函數的,
虛函數的註意事項:
1 隻有類的成員函數才能為虛函數
2 靜態成員函數不能為虛函數,內聯函數和構造函數不能為虛函數
純虛函數
是指被表明為不被具體實現的虛成員函數,它不具備函數的功能,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函數的方法是在函數原型後加”=0″
例如:
virtual void funtion1()=0
demo 認識下純虛函數
#include <iostream> #include <string> using namespace std; class Aname { public: virtual void function_name() = 0; }; class Bname : public Aname { public: void function_name() { cout << "Bname調用瞭function_name" << endl; } }; int main() { Aname *a = new Bname(); a->function_name(); }
純虛函數的註意事項:
1 純虛函數不能被實例化
2 virtual void function_name() = 0; 中 viertual 不能去掉,否則會報錯
虛函數與純虛函數區別
1. 虛函數和純虛函數可以定義在同一個類(class)中,含有純虛函數的類被稱為抽象類(abstract class),而隻含有虛函數的類(class)不能被稱為抽象類(abstract class)。
2. 虛函數可以被直接使用,也可以被子類(sub class)重載以後以多態的形式調用,而純虛函數必須在子類(sub class)中實現該函數才可以使用,因為純虛函數在基類(base class)隻有聲明而沒有定義。
3. 虛函數和純虛函數都可以在子類(sub class)中被重載,以多態的形式被調用。
4. 虛函數和純虛函數通常存在於抽象基類(abstract base class -ABC)之中,被繼承的子類重載,目的是提供一個統一的接口。
5. 虛函數的定義形式:virtual {method body}
純虛函數的定義形式:virtual { } = 0;
在虛函數和純虛函數的定義中不能有static標識符,原因很簡單,被static修飾的函數在編譯時候要求前期bind,然而虛函數卻是動態綁定(run-time bind),而且被兩者修飾的函數生命周期(life recycle)也不一樣。
6. 虛函數必須實現,如果不實現,編譯器將報錯,錯誤提示為:
error LNK****: unresolved external symbol “public: virtual void __thiscall
ClassName::virtualFunctionName(void)”
7. 對於虛函數來說,父類和子類都有各自的版本。由多態方式調用的時候動態綁定。
8. 實現瞭純虛函數的子類,該純虛函數在子類中就編程瞭虛函數,子類的子類即孫子類可以覆蓋
該虛函數,由多態方式調用的時候動態綁定。
9. 虛函數是C++中用於實現多態(polymorphism)的機制。核心理念就是通過基類訪問派生類定義的
函數
10. 多態性指相同對象收到不同消息或不同對象收到相同消息時產生不同的實現動作。C++支持兩種多態性:編譯時多態性,運行時多態性。
a.編譯時多態性:通過重載函數實現
b 運行時多態性:通過虛函數實現。
11. 如果一個類中含有純虛函數,那麼任何試圖對該類進行實例化的語句都將導致錯誤的產生,因為抽象基類(ABC)是不能被直接調用的。必須被子類繼承重載以後,根據要求調用其子類的方法。
到此這篇關於C++ 虛函數與存虛函數的使用與區別的文章就介紹到這瞭,更多相關C++ 虛函數與存虛函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!