C 從入門到放棄之 多重繼承 鑽石繼承 虛繼承

2021-10-23 18:15:38 字數 1440 閱讀 4298

#include

using

namespace std;

class

base1

int m_i;};

class

base2

typedef

int m_i;};

class

derived

:public base1,

public base2

;int

main()

1> 虛繼承作用

通過虛繼承可以讓公共基類子物件在末端子類物件中例項唯一,並可以為所有的中間類共享,在末端子類訪問公共基類成員,即便沿著不同的繼承路徑,所訪問到的基類成員也是一致的

虛繼承是解決c++多重繼承問題的一種手段,從不同途徑繼承來的同一基類,會在子類中存在多份拷貝。這將存在兩個問題:其一,浪費儲存空間;第二,存在二義性問題,通常可以將派生類物件的位址賦值給基類物件,實現的具體方式是,將基類指標指向繼承類(繼承類有基類的拷貝)中的基類物件的位址,但是多重繼承可能存在乙個基類的多份拷貝,這就出現了二義性。

2>虛繼承語法

.在繼承表中使用virtual關鍵字修飾(定義中間類時)

.位於繼承鏈的末端子類負責構造公共基類子物件

3>虛繼承實現的原理

虛繼承底層實現原理與編譯器相關,一般通過虛基類指標和虛基類表實現,每個虛繼承的子類都有乙個虛基類指標(占用乙個指標的儲存空間,4位元組)和虛基類表(不占用類物件的儲存空間)(需要強調的是,虛基類依舊會在子類裡面存在拷貝,只是僅僅最多存在乙份而已,並不是不在子類裡面了);當虛繼承的子類被當做父類繼承時,虛基類指標也會被繼承。

虛表指標->

-/虛基類表(儲存了當前中間類相對於公共基類的偏移量)

-\虛函式表(函式指標陣列,每個函式指標儲存了虛函式在**段的位置)

#include

using

namespace std;

class

aprotected

:int m_data;};

classb:

virtual

public a

void

set(

int data)};

classc:

virtual

public a

intget()

};classd:

public b,

public c };

intmain()

/home/panda/workspace/cpp/cmake-build-debug/cpp

100200

程序已結束,退出** 0

C 從入門到放棄之 C 繼承基本語法

class struct 類名 繼承方式 基類,繼承方式 基類,類名 void 返回值型別 函式名 形參表 常屬性 異常說明 訪問控制限定符 資料型別 變數名 成員變數 include using namespace std class human void eat const string foo...

C 從入門到放棄之 C 函式

內聯函式 inline 函式是否構成過載關係與函式的返回值型別無關 通過函式指標呼叫過載關係的函式,由函式指標的型別決定匹配過載的版本 呼叫過載關係的函式時,編譯器會根據形參和實參的匹配程度,選擇最優的匹配版本,一般的匹配規則 完全匹配 常量轉換 公升級轉換 降級轉換 省略號轉換 在操作符過載函式 ...

Web安全從入門到「放棄」之pikachu環境部署

1.首先進行本地伺服器的搭建 先到官方 安裝xampp 安裝完後的軟體介面 如果開啟apache和mysql顯示錯誤的話,可以開啟日誌檢視錯誤資訊,點選logs開啟error.log日誌檢視。很大情況是埠錯誤,這時候可以修改埠,關於這個問題,網上有很多教程,這裡就不講解了 解壓pikachu.zip...