C 繼承 5 物件切割

2021-07-02 19:51:30 字數 1142 閱讀 6564

目錄

1.物件切割的場景

2.物件切割的避免方法

2.1使用引用

2.2使用指標

2.3使用純虛函式

c++中,乙個子類物件可以直接賦值給乙個基類物件,但是反之則不行。

如下例子所示:

class base ;

class derived : public base ;

int main()

物件切割發生在乙個子類物件賦值給基類物件時,子類自有的資料成員會在基類的物件中被切割掉。

#include using namespace std;

class base

virtual void display()

};class derived : public base

virtual void display()

};// 全域性函式.按值傳遞引數.

void somefunc(base obj)

int main()

輸出:

base class object, i=33

base class object, i=45

可以使用指標或者引用來避免這個問題。當使用指標或者引用來傳遞函式引數時,則不會發生物件切割。因為對於任何型別來說,指標都是占用相同記憶體大小的。

例如,如果把上面程式中的全域性函式somefunc() 修改為下面**,則不會產生物件切割問題。

void somefunc(base &obj)

輸出:

base class object, i=33

derived class object, i=45, j=54

同樣,如果使用指標,也能得到同樣的結果

void somefunc(base *objp)

int main()

輸出:

base class object, i=33

derived class object, i=45, j=54

也可以將基類成員函式定義為純虛函式,來避免物件切割問題。因為虛基類是不能生成物件的。

2018 3 6 物件的繼承

物件繼承 類a具有某些特徵,類 b也具有 a類的所有特徵,同時具有自己更多的一些特徵,此時發現,b類使用 a的特徵資訊並繼續新增自己的一些特有特徵資訊。我們可以說b類繼承於a類。class jizuidongwu class human extends jizuidongwu person1 new...

PHP5物件體系

8 class constants 類常量 php5中可以使用const關鍵字來定義類常量。class foo echo foo c n 11 method constant method 常量 method 是php5中新增的 魔術 常量,表示類方法的名稱。魔術常量是一種php預定義常量,它的值可...

C 基礎學習(5) 物件陣列和物件指標

4.this指標 1.物件陣列的定義和使用說明 在建立物件陣列的時候需要呼叫建構函式,有多少個物件就要呼叫多少次建構函式 如果物件陣列所屬類有帶引數的建構函式,可用初始化列表按順序呼叫建構函式,使用複製初始化來初始化來初始化每個陣列元素 如果物件陣列所屬類有單個引數時,定義陣列時可以直接在初始化列表...