【C++】在繼承中虛擬函式、純虛擬函式、普通函式,三者的區別
阿新 • • 發佈:2019-01-14
1.虛擬函式(impure virtual)
C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現。
子類可以重寫父類的虛擬函式實現子類的特殊化。
如下就是一個父類中的虛擬函式:
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; }
執行結果: