C 多繼承菱形問題和解決方案

2021-10-13 00:21:05 字數 1206 閱讀 7664

多繼承的二義性:

問題產生:乙個派生類有兩個或以上的基類(a b)其中a和b中有相同的成員名稱或介面名稱, 當派生類想呼叫時產生二義性

(這裡的二義性是指無法直接通過變數名進行讀取),需要通過域(::)成員運算子進行區分    

c.a::m_a = 10;

c.b::m_a = 15;

菱形繼承問題

問題產生:乙個派生類有兩個或以上的基類,這些基類中存在相同的基類即(b繼承a c繼承a d繼承b和c) 當派生類想要直接呼叫a類中的方法時,產生二義性。          這裡的二義性是由於他們間接都有相同的基類導致的,除了帶來二義性外,還會浪費空間(每個派生類中都會帶有乙份基類的記憶體)

虛基類:為了解決菱形繼承帶來的問題,c++引入了虛基類 其作用為在間接繼承共同基類時只儲存乙份基類成員,

虛基類宣告: class a{};    class b : virtual public a{};  class c :virtual public a{};

-->虛基類並不是在申明基類時宣告的 而是在派生類時 指定繼承方式宣告的

虛基類的初始化:在派生類中對基類進行初始化還需要對虛基類進行初始化

如d繼承自b和c:d建構函式時需要初始化虛基類 如 d() : b(), c(), a(xx) {}

c++編譯器只執行最後的派生類對基類的建構函式的呼叫,而忽略其他派生類對基類的建構函式的呼叫,從而避免對基類資料成員重複初始化          

多繼承總結:

單繼承:只有乙個直接基類中產生派生類的能力

多繼承:從多個直接基類中產生派生類的能力,派生類物件包含每個基類的子物件

菱形繼承:產生二義性, 增加網域名稱限定符進行區別

虛繼承:解決問題:繼承間接共同基類時只保留乙份成員, 解決菱形繼承時帶來的基類物件重複問題 

形式:class b :virtual public a

初始化:最後派生類中不僅要負責對其直接基類進行初始化還要對虛基類進行初始化, 中間類按照繼承類進行初始化

虛基類:通過虛繼承的方式派生的基類    

過載:同乙個類中, 函式名稱相同,函式引數個數或者型別不同的函式

重寫(覆蓋):基類和派生類中,函式名稱和函式引數都相同 基類中該函式為虛函式 

隱藏:基類和派生類中, 如果和基類中函式名稱相同但是引數不同 則不管基類中該函式是否為虛函式都將隱藏

如果和基類中函式名稱相同引數也相同, 如果基類該函式不是虛函式則基類函式被隱藏

求職相關問題和解決方案

序號 問題分類 詳情應聘者該怎麼辦 1個人問題 1 做過的專案沒自己的亮點 2 工作經歷與崗位不匹配 3 學歷低於要求 4 自己沒有發揮好 5 面試態度問題,沒有激情 不夠坦誠等 6 背調後發現你簡歷造假 7 工作年限與jd要求年限不符 8 薪酬待遇沒談攏 1 工作要注重核心競爭力的培養和總結,在面...

過擬合問題和解決方案

模型越複雜,模型對訓練集的測試效果越好,但對測試集的測試效果很差,此時稱為過擬合。如樣本是9個點,當多項式回歸是2次或3次時,擬合效果不錯但仍有誤差 當多項式是9次時,可以計算出一條曲線完美通過所有樣本點,但這種方式顯然把樣本的噪音全部擬合出來了,模型放到訓練集時效果很差。對此,有正則化 加懲罰項 ...

C 多繼承 菱形繼承 虛繼承

b和c都單繼承了a d繼承了b和c 是多繼承 有兩個或兩個以上的基類就是多繼承 class a public int ma class b public a public int mb class c public a public int mc class d public b,public c ...