C++虚函数与纯虚函数用法与区别
1.?虛函數(shù)和純虛函數(shù)可以定義在同一個類(class)中,含有純虛函數(shù)的類被稱為抽象類(abstract?class),而只含有虛函數(shù)的類(class)不能被稱為抽象類(abstract?class)。
2.?虛函數(shù)可以被直接使用,也可以被子類(sub?class)重載以后以多態(tài)的形式調(diào)用,而純虛函數(shù)必須在子類(sub?class)中實(shí)現(xiàn)該函數(shù)才可以使用,因?yàn)榧兲摵瘮?shù)在基類(base?class)只有聲明而沒有定義。
?
3.?虛函數(shù)和純虛函數(shù)都可以在子類(sub?class)中被重載,以多態(tài)的形式被調(diào)用。
?
4.?虛函數(shù)和純虛函數(shù)通常存在于抽象基類(abstract?base?class?-ABC)之中,被繼承的子類重載,目的是提供一個統(tǒng)一的接口。
?
5.?虛函數(shù)的定義形式:virtual?{method?body}
純虛函數(shù)的定義形式:virtual?{?}?=?0;
在虛函數(shù)和純虛函數(shù)的定義中不能有static標(biāo)識符,原因很簡單,被static修飾的函數(shù)在編譯時候要求前期bind,然而虛函數(shù)卻是動態(tài)綁定(run-time?bind),而且被兩者修飾的函數(shù)生命周期(life?recycle)也不一樣。
?
6.?虛函數(shù)必須實(shí)現(xiàn),如果不實(shí)現(xiàn),編譯器將報錯,錯誤提示為:
error?LNK****:?unresolved?external?symbol?"public:?virtual?void?__thiscall
ClassName::virtualFunctionName(void)"
7.?對于虛函數(shù)來說,父類和子類都有各自的版本。由多態(tài)方式調(diào)用的時候動態(tài)綁定。
?
8.?實(shí)現(xiàn)了純虛函數(shù)的子類,該純虛函數(shù)在子類中就編程了虛函數(shù),子類的子類即孫子類可以覆蓋
該虛函數(shù),由多態(tài)方式調(diào)用的時候動態(tài)綁定。
9.?虛函數(shù)是C++中用于實(shí)現(xiàn)多態(tài)(polymorphism)的機(jī)制。核心理念就是通過基類訪問派生類定義的
函數(shù)
?
10.?多態(tài)性指相同對象收到不同消息或不同對象收到相同消息時產(chǎn)生不同的實(shí)現(xiàn)動作。C++支持兩種多態(tài)性:編譯時多態(tài)性,運(yùn)行時多態(tài)性。
a.編譯時多態(tài)性:通過重載函數(shù)實(shí)現(xiàn)
b?運(yùn)行時多態(tài)性:通過虛函數(shù)實(shí)現(xiàn)。
?
11.?如果一個類中含有純虛函數(shù),那么任何試圖對該類進(jìn)行實(shí)例化的語句都將導(dǎo)致錯誤的產(chǎn)生,因?yàn)槌橄蠡?ABC)是不能被直接調(diào)用的。必須被子類繼承重載以后,根據(jù)要求調(diào)用其子類的方法。
?
#include<iostream> using namespace std;class Virtualbase{public:virtual void Demon() = 0; //prue virtual functionvirtual void Base() { cout << "this is farther class" << endl; }};//sub classclass SubVirtual :public Virtualbase{public:void Demon() {cout << " this is SubVirtual!" << endl;}void Base() {cout << "this is subclass Base" << endl;}};void main(){Virtualbase* inst = new SubVirtual(); //multstate pointerinst->Demon();inst->Base();// inst = new Virtualbase();// inst->Base()system("pause");return;} }結(jié)果:1. 子類實(shí)現(xiàn)2. 打印基類?
總結(jié)
以上是生活随笔為你收集整理的C++虚函数与纯虚函数用法与区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7 下安装 Redis
- 下一篇: 优先队列实现迪杰特斯拉模板