C++中虚函数、纯虚函数、普通函数三者的区别
轉載自:https://www.cnblogs.com/cj2014/p/7692707.html
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;}//自己添加的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;
}
運行結果:
B(out1)
B(out2)
A(out3)
*****************
B(out1)
B(out2)
B(out3)
定義一個函數為虛函數,不代表函數為不被實現的函數。
定義他為虛函數是為了允許用基類的指針來調用子類的這個函數。
定義一個函數為純虛函數,才代表函數沒有被實現。
定義純虛函數是為了實現一個接口,起到一個規范的作用,規范繼承這個類的程序員必須實現這個函數
總結
以上是生活随笔為你收集整理的C++中虚函数、纯虚函数、普通函数三者的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10 道关于 Java 泛型的面试题
- 下一篇: 形象的解释神经网络激活函数的作用是什么