簡體   English   中英

C ++死亡鑽石

[英]C++ Diamond of Death

好的,所以我了解當您完全控制所有類時如何解決死亡繼承的難題,但是如果您僅控制要從這兩個類繼承的最后一個類怎么辦,所以我知道:

class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};

而且我沒有辦法只編輯B和C,只有D的簡便方法嗎?

這是一個很好的理由,您不能強迫BC共享A 考慮:

struct A {int i;};
struct B : A {
 B(){i=3;}
 void foo() {
  //crash if i!=3
 }
};
struct C : A {
 C(){i=4;}
 void bar() {
  //crash if i!=4
 }
};

BC是好班。 他們無法處理無法進入的情況(i的無效值)。

如果有一種方法可以滿足您的要求( struct D:B,C ,其中BC共享A ),那么D::A::i的值是多少?

虛擬繼承的意思是“我需要這個類,但是我不需要為其提供一些有效的值,而我完全可以與其他人混淆”。

通過圍堵將其偽造。 讓D包含B和C,並為D提供與B和C的公共接口的並集相同的公共接口。 然后從D的公共接口調用B和C的適當方法。

當然,您將遇到一個問題,即轉換和多態性,因為它不會遵循繼承定律。

簡而言之,沒有好辦法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM