當把乙個派生類物件賦給乙個基類物件時,會發生物件切割。(另外用基類物件強制轉換派生類物件也會)
物件切割會發生什麼呢?
#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...