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...