class A { public: virtual void out2(string s) { cout<<"A(out2):"<<s<<endl; } };
2.純虛函數(pure virtual) C++中包含純虛函數的類,被稱為是“抽象類”。抽象類不能使用new出對象,只有實現了這個純虛函數的子類才能new出對象。 C++中的純虛函數更像是“只提供申明,沒有實現”,是對子類的約束,是“接口繼承”。 C++中的純虛函數也是一種“運行時多態”。 如下面的類包含純虛函數,就是“抽象類”:
class A { public: virtual void out1(string s)=0; virtual void out2(string s) { cout<<"A(out2):"<<s<<endl; } };
3.普通函數(no-virtual) 普通函數是靜態編譯的,沒有運行時多態,只會根據指針或引用的“字面值”類對象,調用自己的普通函數。 普通函數是父類為子類提供的“強制實現”。 因此,在繼承關系中,子類不應該重寫父類的普通函數,因為函數的調用至於類對象的字面值有關。 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; }