一、什麼是菱形繼承?
下面先給出乙個圖來說明菱形繼承:
以下是菱形繼承的物件模型:
圖中,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.名字空間域解決全域性命名衝突的問題...