c 物件切割示例

2021-12-29 22:40:32 字數 1154 閱讀 2419

概念

當乙個子類物件通過值傳遞給基類物件,如foo(base derived_obj),這個基類的拷貝建構函式將被呼叫.此時子類的特性將被切割,只有基類相關操作. 也就是說如果我們向上轉型如果不用引用或指標,物件將被切割.這是也我們應該傳引用而不是傳值的原因.

示例**:

[cpp]

#include  

#include  

using namespace std; 

class animal 

virtual void eat() const  

private: 

string name; 

};  

class bird : public animal ; 

virtual void eat() const  

};  

void whatareyoudoin**alue(animal a)  

void whatareyoudoingreference(const animal &a)  

int main() 

輸出結果如下:

pass-by-value

animal: animal eat()

animal: eagle eat()

pass-by-reference

animal: animal eat()

bird: bald eat() in us and canada

分析:注意,我們在main()函式中呼叫了兩個函式,whatareyoudoin**alue(animal a)與whatareyoudoingreference(constanimal &a).第乙個呼叫是能過傳值,第二個呼叫是傳引用.

我們可能希望第乙個呼叫輸出 animal:animal eat(),第二個呼叫輸出bird: bald eat() in us and canada.事實上兩個都是呼叫基類的eat.www.2cto.com

為什麼呢?

在傳值例子中,因為eat()是被animal 的物件執行的object.這樣倒至animal物件被進行壓棧操作.這樣就造成如果是值傳遞呼叫animal預設建構函式,初始化vptr通過animal類的vtbl並且只拷貝animal部分.所以結果只剩下animal部分了。

作者:wpf_ml

C 物件切割

當把乙個派生類物件賦給乙個基類物件時,會發生物件切割。另外用基類物件強制轉換派生類物件也會 物件切割會發生什麼呢?include stdafx.h include using namespace std class cshape cshape virtual void draw double m c...

C 之物件切割

from 華山大師兄 問題描述 程式如下 include include using namespace std class base class derived public base void fun1 base b void fun2 base b void fun3 base b intma...

c 物件切割 Object Slicing

當把乙個派生類物件賦給乙個基類物件時,會發生物件切割。另外用基類物件強制轉換派生類物件也會 物件切割會發生什麼呢?include using namespace std class cshape cshape virtual void draw double m color class crect ...