2016-03-08 19 views
0

如果在大量遺產中關鍵字virtual被遺忘了,會發生什麼情況?虛擬繼承:如果關鍵字在某個時刻被遺忘會發生什麼?

例如:

struct I {}; 

struct A : virtual I {}; 

struct B : A, virtual I {}; 

struct C : B, /* virtual */ I {}; // ooops, distraction error 

是不是像在方法的情況下,一旦一個方法是虛擬的它住宿虛擬永恆,要麼是struct C重新引入鑽石問題

有沒有辦法讓編譯器檢查這種類型的錯誤,類似的方式是新的override關鍵字正在檢查正確的重寫虛擬方法?

+0

編譯器如何知道這是一個錯誤?這是完全有效和合理的代碼。另外,爲什麼你會如此使用虛擬繼承? –

+0

從編譯器視圖看,這不是錯誤,而且這樣的代碼是合理的(ish)?在我所有的編碼年代裏,我從來沒有在自己的生活中使用過鑽石遺產。我想,如果你已經用這種繼承來設計你的系統,那就回去重新設計吧。 – SergeyA

+0

會發生什麼情況是您的單元測試失敗。

回答

4

這裏會發生什麼情況如下:

  1. A得到I作爲其記憶的一部分
  2. B正是A獲得作爲其記憶的一部分
  3. Ç恰好獲得B加上額外I作爲其存儲器的一部分

所以它不是鑽石,而是更像一個破碎的叉:

I 
| 
A 
| 
B I 
\/
    C 

而且,它不是嚴格意義上的錯誤—至少不是一個編譯錯誤—但語言的一個特徵。

至於避免它,你應該限制你的虛擬繼承工作,當你真的集中注意力時,和/或儘可能地避免它。

0

如果在一個大型繼承鏈中虛擬關鍵字 在某個點被遺忘了會發生什麼?

struct A : virtual I {}; 

struct B : A, virtual I {}; 

你爲什麼會連 「重新引入」 I它已經是一個虛擬的基類。你只是多餘的。

沒有理由這樣做。唯一可能的原因是放寬訪問控制(或訪問私有虛擬基類),並且基類已經在這裏公開。

所以這個問題只是沒有意義。當你不再重複基類名時,你不能忘記繼承鏈中的第二個virtual