C 中的繼承問題

2021-08-04 04:11:54 字數 2231 閱讀 8531

繼承:物件導向程式設計 使**可以復用

,並允許程式設計師在原有類特性的基礎上進行擴充套件,增加功能。

繼承定義格式

};總結:

1.基類的private成員在派生類中是不能被訪問的,基類的protected成員和public成員可以在派生類內部被訪問;

2.public繼承是乙個介面繼承,保持is-a原則,每個父類可用的成員對子類也可用;

3.protected/private繼承是乙個實現繼承,基類的部分成員並非完全成為子類介面的一部分,是has-a原則;

4.使用關鍵字class時預設的繼承方式是private,使用struct時預設的繼承方式是public;

繼承與轉換  賦值相容規則  public繼承

1.子類物件可以賦值給父類物件;

2.父類物件不能賦值給子類物件;

3.父類指標/引用可以指向子類物件;

4.子類指標/引用不能指向父類物件。

單繼承和多繼承

單繼承:乙個子類只有乙個直接父類時稱這個繼承關係為單繼承

多繼承:乙個子類有兩個或兩個以上直接父類時稱這個繼承關係為多繼承

繼承關係中的建構函式和析構函式呼叫順序

通過上面的結果我們可以理解:

建構函式的呼叫順序

基類的建構函式——>派生類物件建構函式——>派生類建構函式體

建構函式的呼叫順序

派生類的析構函式——>派生類物件析構函式——>基類析構函式

菱形繼承和菱形虛擬繼承

d的物件中有兩份b成員,菱形繼承存在二義性和資料冗餘的問題

下面用菱形虛擬繼承解決二義性問題

#includeusing namespace std;

class b

;class c1 :virtual public b

;class c2 :virtual public b

;class d :public c1, public c2

;void test()

int main()

通過監視,我們可以看到d物件的兩個_b成員值都被賦為0:

再來通過記憶體看一下菱形虛擬繼承的物件模型

虛繼承解決了在菱形繼承體系裡面子類物件包含多份父類物件的資料冗餘和浪費空間的問題。

上圖中解決二義性使用的是偏移量。

C 中的繼承問題

在刷程式設計師面試寶典時看到這樣一題 include using namespace std class a void print class b classa int main 答案輸出為12 答案解釋是b類中的 a把a類中的 a 隱藏 了。在構造b類時,先呼叫a類的建構函式,所以a類的 a是1,...

C 中類的繼承問題03

using system using system.collections.generic using system.text sealed class a 密封類可以例項化,但不能繼承 class c a a是密封類,所以不能繼承,只能例項化 所以此處編譯時是錯誤的 class d public ...

C 繼承中的建構函式問題

c 的繼承是不會整合建構函式的,但是子類在實現建構函式時會預設呼叫父類中的無參建構函式 想要不呼叫就要在子類中進行一些特殊操作 class program class person public person 子類需要呼叫父類的無參建構函式 public string name public int...