程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 菱形繼承問題(鑽石問題),菱形繼承問題鑽石

菱形繼承問題(鑽石問題),菱形繼承問題鑽石

編輯:C++入門知識

菱形繼承問題(鑽石問題),菱形繼承問題鑽石


在學習C++的時候,菱形繼承問題絕對是一個不可避免的重點問題,那麼什麼是菱形繼承問題呢?下圖就是,長得像不像鑽石?我畫圖確實很難看

因為C++允許多繼承,當繼承關系像上圖這樣子的時候,就會出現這樣子的情況

A類是基類,B裡面有個A我表示為B(A),C裡面有個A我表示為C(A)

那麼D裡面有B和C我表示為D(B(A)C(A))

當我們想去使用D裡面的A的時候,或者說訪問A的部分值,在說白了究竟哪個A才是屬於D的,D中的A究竟是B的A還是C的A?

1 class A 
2 {};
3 class B :public A
4 {};
5 class C :public A
6 {};
7 class D :public B, public C
8 {};

這麼寫可就錯了,有的編譯器甚至都不讓你通過,直接給你報錯

這很令人尴尬不是麼,就算編譯期讓你通過了,也不要試圖這樣去通過D的對象訪問其內部的A對象,這會讓編譯器很糾結

但是很簡單給個vitual就好了

1 class A 
2 {};
3 class B :virtual public A
4 {};
5 class C :virtual public A
6 {};
7 class D : public B, public C
8 {};

他有了一個屬於自己的A,調用A中的變量或者函數的時候就會去屬於自己的A中調用,就不會讓編譯期糾結了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved