1.虛函數(impure virtual)ios
C++的虛函數主要做用是「運行時多態」,父類中提供虛函數的實現,爲子類提供默認的函數實現。函數
子類能夠重寫父類的虛函數實現子類的特殊化。spa
以下就是一個父類中的虛函數:指針
class A { public: virtual void out2(string s) { cout<<"A(out2):"<<s<<endl; } };
2.純虛函數(pure virtual)code
C++中包含純虛函數的類,被稱爲是「抽象類」。抽象類不能使用new出對象,只有實現了這個純虛函數的子類才能new出對象。對象
C++中的純虛函數更像是「只提供申明,沒有實現」,是對子類的約束,是「接口繼承」。blog
C++中的純虛函數也是一種「運行時多態」。繼承
以下面的類包含純虛函數,就是「抽象類」:接口
class A { public: virtual void out1(string s)=0; virtual void out2(string s) { cout<<"A(out2):"<<s<<endl; } };
3.普通函數(no-virtual)string
普通函數是靜態編譯的,沒有運行時多態,只會根據指針或引用的「字面值」類對象,調用本身的普通函數。
普通函數是父類爲子類提供的「強制實現」。
所以,在繼承關係中,子類不該該重寫父類的普通函數,由於函數的調用至於類對象的字面值有關。
4.程序綜合實例
#include <iostream> using namespace std; class A { public: virtual void out1()=0; ///由子類實現 virtual ~A(){}; virtual void out2() ///默認實現 { cout<<"A(out2)"<<endl; } void out3() ///強制實現 { cout<<"A(out3)"<<endl; } }; class B:public A { public: virtual ~B(){}; void out1() { cout<<"B(out1)"<<endl; } void out2() { cout<<"B(out2)"<<endl; } void out3() { cout<<"B(out3)"<<endl; } }; int main() { A *ab=new B; ab->out1(); ab->out2(); ab->out3(); cout<<"************************"<<endl; B *bb=new B; bb->out1(); bb->out2(); bb->out3(); delete ab; delete bb; return 0; }
執行結果: