c 物件切割 Object Slicing

2021-06-19 14:51:50 字數 1583 閱讀 3108

當把乙個派生類物件賦給乙個基類物件時,會發生物件切割。(另外用基類物件強制轉換派生類物件也會)

物件切割會發生什麼呢?

#include

using namespace std;

class cshape

~cshape(){}

virtual void draw()

double m_color;

}; class crect: public cshape

~crect(){};       

double size()

virtual void draw()

double m_width;

double   m_height; };

int main(int argc, char* argv)

shp=rect; 會呼叫cshape的預設賦值函式,shp的cshape屬性值與rect相同,但其虛函式表指標指向基類cshape虛函式表。

((cshape)rect).draw(); 會呼叫cshape預設的拷貝建構函式,生成乙個中間變數,其虛函式表指標指向基類cshape虛函式表。

多型的實現是通過指標和引用;而物件的轉換只會造成物件切割,不能實現多型。

注意下面兩句的不同

*pshape=rect;//物件切割

pshape=▭//多型

附基類和派生類物件間賦值的問題:

class a

class b:public a

a a_object;

b b_object; 有關

(1)a_boject=b_object;

(2)b_object=a_boject;

的說明。

**********====

(1)aobject=bobject; 呼叫default a::operator =,由編譯器自動生成,它的函式宣告大致類似於:a operator = (a rhs),反正=號右邊要求是乙個a的物件,bobject作為a的子類物件亦是可行的,只不過傳遞過程中會產生「截斷」。

(2)bobject=aobject; 呼叫default b::operator =,也由編譯器自動生成,它的函式宣告大致類似於:b operator = (b rhs),這裡=號右邊要求是乙個b的物件,aobject這時就不可行了。(編譯器將報錯)

這時,單單過載b::operator =也無濟於事,因為你無法改變operator = 函式引數必須是b物件的這個事實。要實現bobject=aobject;可以過載強制型別轉換函式,也可以利用編譯器隱式型別轉換的能力,如:

class a};

class b:public a

b(a a){}//必須有

};a aobject;

b bobject;

int main()

--------------------------------------

class 物件作引數時,用reference to const替換pass by value可避免物件切割。

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 物件切割示例

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