C 中virtual的三種用法

2021-10-03 10:18:23 字數 2330 閱讀 2441

virtual用法一:

#include

using

namespace std;

classa}

;classb:

public a};

void

dodisplay

(a *p)

intmain

(int argc,

char

* ar**)

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

virtual用法二:

#include

using

namespace std;

class

person

~person()

};class

teacher

:virtual

public person

~teacher()

};class

student

:virtual

public person

~student()

};classts:

public teacher,

public student~ts

()};

intmain

(int argc,

char

* ar**)

這段**的終端輸出結果為:

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用法三:

#include

using

namespace std;

class

person

virtual

~person()

private

:char

*name;};

class

teacher

:virtual

public person

~teacher()

};class

student

:virtual

public person

~student()

};classts:

public teacher,

public student~ts

()};

intmain

(int argc,

char

* ar**)

這段**的執行結果為:

person構造

teacher構造

student構造

ts構造

ts析構

student析構

teacher析構

person析構

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

person構造

teacher構造

student構造

ts構造

person析構

C 中virtual的三種用法

virtual用法一 includeusing namespace std class a int main int argc,char argv 這段 列印出的結果為b,但是當把a類中的virtual去掉之後列印出的就為a。當基類中沒有virtual的時候,編譯器在編譯的時候把p看做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...