C 中virtual的三種用法

2021-08-15 21:07:55 字數 1653 閱讀 8828

virtual用法一:

#includeusing namespace std;

class a

int main(int argc,char* argv)

這段**列印出的結果為b,但是當把a類中的virtual去掉之後列印出的就為a。當基類中沒有virtual的時候,編譯器在編譯的時候把p看做a類的物件,呼叫的自然就是a類的方法。但是加上virtual之後,將dispaly方法變成了虛方法,這樣呼叫的時候編譯器會看呼叫的究竟是誰的例項化物件,這樣就實現了多型的效果。也就是說,當基類的派生類中有重寫過基類的虛方法的時候,使用基類的指標指向派生類的物件,呼叫這個方法實際上呼叫的會是派生類最後實現的方法。

virtual用法二:

#includeusing namespace std;

class person{

public: person(){ cout<<"person構造"《這段**的終端輸出結果為: 

person構造

teacher構造

student構造

ts構造

ts析構

student析構

teacher析構

person析構

當teacher類和student類沒有虛繼承person類的時候,也就是把virtual去掉時候終端輸出的結果為: 

person構造

teacher構造

person構造

student構造

ts構造

ts析構

student析構

person析構

teacher析構

person析構

大家可以很清楚的看到這個結果明顯不是我們所期望的。我們在構造ts的時候需要先構造他的基類,也就是teacher類和student類。而teacher類和student類由都繼承於person類。這樣就導致了構造ts的時候例項化了兩個person類。同樣的道理,析構的時候也是析構了兩次person類,這是非常危險的,也就引發出了virtual的第三種用法,虛析構。

virtual用法三:

#includeusing namespace std;

class person{

public: person() {name = new char[16];cout<<"person構造"《這段**的執行結果為:

person構造

teacher構造

student構造

ts構造

ts析構

student析構

teacher析構

person析構

但是當我們把person類中析構前面的virtual去掉之後的執行結果為:

person構造

teacher構造

student構造

ts構造

person析構

程式崩潰

很明顯這個結果不是我們想要的程式,崩潰造成的後果是不可預計的,所以我們一定要注意在基類的析構函式前面加上virtual,使其變成虛析構在c++程式中使用虛函式,虛繼承和虛析構是很好的習慣 可以避免許多的問題。

C 中virtual的三種用法

virtual用法一 include using namespace std classa classb public a void dodisplay a p intmain int argc,char ar 這段 列印出的結果為b,但是當把a類中的virtual去掉之後列印出的就為a。當基類中沒...

C 中 的三種用法

可null型別修飾符 對於一些不能為null的型別可以通過?的修飾使其為null。其中user?id可以很方便的來查詢例項的屬性的值而不用預先判斷例項是否為null。三元表示式 int value 1 1 1 0 判斷1 1返回true還是false,返回true就返回1,返回false就返回0 n...

C 中new三種用法

new operator new的表示式 string str new string abcde 既分配記憶體也初始化物件 operator new new的操作符 void buff operator new sizeof string 類似於malloc 只分配空間不進行初始化 placemen...