C 子類物件當父類物件使用

2021-08-10 19:58:52 字數 2318 閱讀 3657

子類物件當父類物件使用

1⃣️把子類物件直接賦值給父類物件(等號左邊是父類物件,等號右邊是子類物件)

子類物件賦值給父類物件,僅僅把繼承自父類部分成員函式賦值給父類物件

賦值完成後等號左邊依然是乙個父類物件

derived d;

base b;

b=d;//把子類物件d當成父類物件來使用

(父類物件不能賦值給子類物件,也就是說父類物件不能當成子類物件使用)

2⃣️父類的引用指向子類物件

(1)用子類物件初始化父類引用

base b1(1);

derived d1(10,10);

base &b2=d1;// 子類物件當父類物件

b2.print(); // 呼叫父類函式

b2依然不能呼叫擴充套件的成員函式

(2)函式形參是父類引用,而實參是子類物件

void func(base &b){}

base b1(1);

derived d1(10,20);

func(d1); // 子類物件當成父類物件使用

(3) 函式返回值型別是父類引用,返回值為乙個子類物件

base& func1()

釋放堆上空間用乙個來接收 base &b=func1();

然後釋放他 delete &b;

3⃣️父類指標指向子類物件

(1)用子類物件的位址初始化父類指標

base b1(10);

derived d1(1,2);

base *p=&d1;

p->print(); // 呼叫的是父類的成員函式

p依然是乙個父類物件的指標,不能呼叫子類擴充套件的成員函式,父類物件的位址不可以賦值給自樂物件

(2)函式形參是父類指標,而實參是子類物件位址

void func(base *b){}

base b1(1);

derived d1(10,20);

func(&d1); // 實參是子類物件位址,子類物件當成父類物件使用

(3)函式返回值型別是父類指標,返回值為乙個子類物件的位址

base* func3()

func3()->print();

釋放堆上空間用乙個來接收 base &b=func1();

然後釋放他 delete &b;

注意:1⃣️=左邊永遠是父類,賦值完成後,=左邊依然是父類

2⃣️可以把子類物件當父類物件使用,但是不可以把父類物件當成子類物件使用

3⃣️賦值完成後,父類物件指標引用不可以呼叫子類擴充套件的成員函式

子類物件當父類物件使用:關於拷貝建構函式時出現

(1)用已經存在的子物件初始化父類物件

derived d1(10,20);

base b1(d1); // 呼叫父類的拷貝建構函式

(2)函式形參是父類物件,形參是子類物件

void func(base b){}// base b=d1; 呼叫父類的拷貝建構函式

derived d1(1,2);

func(b);

(3)函式返回值型別為父類物件,實際返回值為子類物件

base func()

向下轉型:

如果父類指標指向子類物件位址,如果想通過父類指標呼叫子類擴充套件的成員函式,需要把父類指標強制轉換成子類指標

base b1(10);

derived d1(1,2);

base *p=&d1;

p->print(); // 呼叫父類成員函式

((derived*)p)->print(); // 把父類指標強制轉換成子類指標 呼叫子類成員函式

強制型別的向下轉型是乙個不安全的轉型方式,原因是父類指標在轉換成子類指標時,辨別不出來自己是否轉型成功,不報錯。(多繼承無能為力)

子類中的建構函式,析構函式。拷貝建構函式

1.建構函式:呼叫父類的普通建構函式,完成繼承自父類部分成員的初始化

2.拷貝建構函式:呼叫父類的拷貝建構函式,完成繼承自父類部分成員的初始化

先呼叫父類的建構函式,後呼叫子類的建構函式

3.子類的析構函式

子類只負責釋放自己擴充套件的成員,父類部分;當子類析構完成,自動呼叫父類的析構函式來釋放繼承自父類的析構函式

先呼叫子類的析構函式,在呼叫父類的析構函式

4.賦值運算子過載:

繼承自父類部分由父類的賦值運算子完成賦值,子類只需要完成自己擴充套件部分的賦值

**:

父類引用子類物件

父類引用子類物件 package test class fruit1 string get1 父類引用子類物件 如果父類的方法可以被重寫 靜態方法不能被重寫,因為它是隨著類的建立而存在於記憶體,只有乙份 並且已經重寫,那麼呼叫的是子類的方法 反之,則呼叫父類裡的方法 public class fru...

c 父類指標指向子類物件

父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾...

c 父類指標指向子類物件

父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾...