1、構(gòu)造函數(shù)不能是虛函數(shù)。因?yàn)闃?gòu)造函數(shù)不是一個(gè)普通的函數(shù),要構(gòu)造一個(gè)對(duì)象,構(gòu)造函數(shù)必須掌握所創(chuàng)建的對(duì)象的確切類型,因此構(gòu)造函數(shù)不能是虛的。
2、析構(gòu)函數(shù)可以是虛函數(shù)。首先我們要搞清楚為什么要虛析構(gòu)函數(shù)?這樣做是為了當(dāng)用一個(gè)基類的指針刪除一個(gè)派生類的對(duì)象時(shí),派生類的析構(gòu)函數(shù)會(huì)被調(diào)用。也就是只有當(dāng)靜態(tài)類型為基類,而動(dòng)態(tài)類型為子類時(shí),為了確保子類的析構(gòu)函數(shù)能被調(diào)用,基類的析構(gòu)函數(shù)必須被聲明為虛析構(gòu)函數(shù)。
一般情況下類的析構(gòu)函數(shù)里面都是釋放內(nèi)存資源,而析構(gòu)函數(shù)不被調(diào)用的話就會(huì)造成內(nèi)存泄漏。當(dāng)然,如果在析構(gòu)函數(shù)中做了其他工作的話,那你的所有努力也都是白費(fèi)力氣。
當(dāng)然,并不是要把所有類的析構(gòu)函數(shù)都寫(xiě)成虛函數(shù)。因?yàn)楫?dāng)類里面有虛函數(shù)的時(shí)候,編譯器會(huì)給類添加一個(gè)虛函數(shù)表,里面來(lái)存放虛函數(shù)指針,這樣就會(huì)增加類的存儲(chǔ)空間。所以,只有當(dāng)一個(gè)類被用來(lái)作為基類的時(shí)候,才把析構(gòu)函數(shù)寫(xiě)成虛函數(shù)。
3、純虛函數(shù)
聲明純虛函數(shù)的方法:
virtual void purefun()=0;
聲明一個(gè)純虛函數(shù)pure virtual 的目的就是讓Derived class只繼承函數(shù)接口,因?yàn)樗鼪](méi)有定義。但是實(shí)際上是可以有一份Defualt定義的,在使用時(shí)需要指出類名。如:
Derived->Base::Purefunction();
注意含有純虛函數(shù)的類是不能被實(shí)例化的。如果Base類中有一個(gè)純虛函數(shù)purefun(),Derived繼承了Base后必須對(duì)purefun()進(jìn)行重寫(xiě),否則Derived也是一個(gè)函數(shù)純虛函數(shù)的類,同樣是不能被實(shí)例化的。
4、virtual函數(shù)的缺省參數(shù)值是靜態(tài)綁定的,所以記住決不要重新定義繼承而來(lái)的virtual 函數(shù)的缺省參數(shù)值。
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
class Base
{
public:
virtual void display(int i =1)
{
cout<<"Base Display"<<endl;
}
};
class Derived :public Base
{
public:
virtual void display(int i = 2)
{
if(i ==2)
cout<<"derived i==2"<<endl;
if(i == 1)
cout<<"derived i ==1"<<endl;
}
};
int main()
{
Base* p=new Derived();
p->display();
}
輸出是"derived i==1"