CPP基礎知識 關於菱形繼承

2021-08-10 07:11:35 字數 1133 閱讀 4653

一、什麼是菱形繼承?

下面先給出乙個圖來說明菱形繼承:

以下是菱形繼承的物件模型:

圖中,b類繼承了a類(單繼承),c類也繼承了a類(單繼承),d類既繼承了a類,又繼承了b類(多繼承),這樣就構成了乙個「菱形」繼承。

下面我們把這個模型用**例項化一下:

class a

;class b:public a

;class c :public a

;class d :public b, public c

;

從上面的程式可以看出來,d類由於繼承b類和c類,相當於間接的繼承了兩次a類,這樣如果直接訪問 _a 就會有二義性和資料冗餘的問題,如:

c c1;

c1._a;

//c1 a::_a;

//這兩種訪問都有二義性

而以下兩個訪問是正確的:

c1

.b::_a;

c1.c

::_a;

但是這樣用類名限定訪問未免過於麻煩,那麼,如何能更好的解決菱形繼承的二義性和資料冗餘的問題呢?下面簡單介紹用虛繼承解決這個問題:

二、虛繼承是怎麼解決二義性和資料冗餘

1.虛基類說明格式:

virtual繼承方

基類

2.用法(還是用上面那個例子說明)

class a

;class b:virtual

public a

;class c :virtual

public a

;class d :public b, public c

;

由於使用了虛基類,因此就將兩個公共基類合併成了乙個類,這樣也就消除了合併之前可能出現的二義性。

CPP入門基礎知識

一.命名空間 1.命名空間的定義 命名空間的名字在其所在作用域中是唯一的,命名空間可以在全域性作用域或者其它作用域內部定義,但是不能在函式或者類的內部定義,命名空間作用域不能以分號結束。1 每個命名空間都是乙個作用域 命名空間中的每個名字必須引用該命名空間中的唯一實體,命名空間中的實體稱為命名空間的...

CPP入門基礎知識

1 命名空間 命名空間相當於乙個更加靈活的全域性域,可以用花括號把檔案的一部分括起來,並以關鍵字namespace開頭給它起乙個名字 如下定義兩個命名空間 namespace aa1namespace aa2 int main 可以看到兩個變數名都可以用a 所以命名空間域解決了全域性命名衝突的問題 ...

cpp入門基礎知識

1.命名空間域是隨標準c 而引入的。它相當於乙個更加靈活的檔案域 全域性域 可以用花括號把檔案的一部分括起來,並以關鍵字namespace開頭給它起乙個名字 namespace name1 namespace name2 name1 a 3 name2 a 4 2.名字空間域解決全域性命名衝突的問題...