概念
當乙個子類物件通過值傳遞給基類物件,如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 ...