C++繼承中的普通函數,純虛函數、虛函數、

C++ 在繼承中虛函數、純虛函數、普通函數,三者的區別

1.普通函數(no-virtual)

普通函數是靜態編譯的,沒有運行時多態,只會根據指針或引用的“字面值”類對象,調用自己的普通函數。

普通函數是父類爲子類提供的“強制實現”。

因此,在繼承關係中,子類不應該重寫父類的普通函數,因爲函數的調用至於類對象的字面值有關。

2.純虛函數(pure virtual)

C++中包含純虛函數的類,被稱爲是“抽象類”。抽象類不能使用new出對象,只有實現了這個純虛函數的子類才能new出對象。

C++中的純虛函數更像是“只提供申明,沒有實現”,是對子類的約束,是“接口繼承”。

C++中的純虛函數也是一種“運行時多態”。

如下面的類包含純虛函數,就是“抽象類”:

#FormatImgID_4#

#FormatImgID_5#

class A

{

public:

virtual void out1(string s)=0;

virtual void out2(string s)

{

cout<<“A(out2):”<<s<<endl;

}

};

#FormatImgID_6#

#FormatImgID_7#

3.虛函數(impure virtual)

C++的虛函數主要作用是“運行時多態”,父類中提供虛函數的實現,爲子類提供默認的函數實現。

子類可以重寫父類的虛函數實現子類的特殊化。

如下就是一個父類中的虛函數:
在這裏插入圖片描述
#FormatImgID_1#

class A

{

public:

virtual void out2(string s)

{

cout<<“A(out2):”<<s<<endl;

}

};

#FormatImgID_2#

#FormatImgID_3#

4.程序綜合實例

#FormatImgID_8#

#FormatImgID_9#

#include

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;

}

//自己添加的 void out4()//子類中可以有父類沒有的函數

{

cout<<“B(out4)”<<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; }

#FormatImgID_10#

#FormatImgID_11#

執行結果:

#FormatImgID_0#


定義一個函數爲純虛函數,才代表函數沒有被實現。

定義純虛函數是爲了實現一個接口,起到一個規範的作用,規範繼承這個類的程序員必須實現這個函數

定義一個函數爲虛函數,不代表函數爲不被實現的函數。

定義他爲虛函數是爲了允許用基類的指針來調用子類的這個函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章