何時在多重繼承中出現歧義?何時在多重繼承中出現歧義?
0
A
回答
4
1
struct Base{
void foo(){
}
};
struct Derived1 : public Base{
};
struct Derived2 : public Base{
};
struct Final : public Derived1, public Derived2{
};
int main(){
Final f;
f.foo();
}
See on Ideone。要修正,只需使用虛擬繼承:
struct Derived1 : virtual public Base{
};
struct Derived2 : virtual public Base{
};
另一種可能性爲ambigouty如下:
struct Base1{
void foo(){
}
};
struct Base2{
void foo(){
}
};
struct Final : public Base1, public Base2{
};
int main(){
Final f;
f.foo();
}
再次,Ideone。要解決,簡單的湊合在Final
如下:在多重繼承的模糊性
struct Final : public Base1, public Base2{
using Base1::foo;
// or
// using Base2::foo;
};
3
一個著名的例子就是所謂的鑽石問題。
Summary: 「在具有多重繼承和知識組織的面向對象編程語言中,當兩個類B和C從A繼承並且D從B和C繼承時,鑽石問題就會出現模糊性。 D中的方法調用A中定義的方法(並且不覆蓋該方法),並且B和C以不同的方式重寫該方法,那麼它從哪個類繼承:B或C?「
你可以在這裏找到細節:Wikipedia: Diamond Problem
0
當它使得使用不清楚名時,同一類是通過多個路由基礎
class baseX
{
private:
void* callA();//will never be ambiguous.
protected:
void* callB();
public:
void* callC();
}
class baseY
{
private:
void* callA();//will never be ambiguous.
protected:
void* callB();
public:
void* callC();
}
class derived: public baseX, public baseY
{
void someMethod()
{
void* x = baseX::callB();//not ambiguous
void* y = baseY::callB();//not ambiguous
void* z = callB();//ambiguose
}
}
void someFunction(derived& d)
{
void* x = d.CallC();//ambiguous
}
歧義也有可能發生:
class Base
{
public void call();
}
class DerivedX : public Base
{
}
class DerivedY : public Base
{
}
class GrandChild : public DerivedX, public DerivedY //What does call() do?
{
}
這可以用虛擬基地解決:
class Base
{
public void call();
}
class DerivedX : public virtual Base
{
}
class DerivedY : public virtual Base
{
}
class GrandChild : public DerivedX, public DerivedY //only one "Base" class in inheritance, shared between DerivedX and DerivedY
{
}
相關問題
- 1. 虛擬繼承如何解決「菱形」(多重繼承)歧義?
- 2. 多重虛擬繼承歧義
- 3. C++ 11:消除歧義類成員在多重繼承
- 4. 如何實現多重繼承?
- 5. 多重繼承
- 6. 多重繼承
- 7. 多重繼承()
- 8. 多重繼承
- 9. 多重繼承
- 10. 多重繼承
- 11. 多重繼承
- 12. 從直接多重繼承變爲間接多重繼承時會出現什麼問題?
- 13. 在java中繼承時出現重載錯誤?
- 14. 如何在C#中實現多繼承?
- 15. C++多繼承靜態函數調用歧義
- 16. 如何在javascript中多重繼承
- 17. 虛擬關鍵字如何解決多繼承中的歧義問題?
- 18. 如何在Java中實現多重繼承
- 19. 如何在SQL中實現多重繼承?
- 20. 多重繼承和指針實現
- 21. Ruby中的多重繼承
- 22. LINQtoSQL中的多重繼承?
- 23. 多重繼承在C++
- 24. 多重繼承C#
- 25. C++多重繼承
- 26. C++多重繼承
- 27. 多重繼承:2Classes1Method
- 28. 多重繼承 - 是否有出路?
- 29. 蟒蛇多重繼承輸出問題
- 30. Ruby中的多重繼承...繼承自多個控制器類。
請稍候。也許是例子? etc – 2011-03-28 12:47:00
取決於什麼是模糊的。您可以擁有鑽石繼承,並且具有多次繼承的相同基類。或者,您可以擁有多個具有公共/受保護成員變量/函數且名稱相同的基礎,需要明確的訪問權限。 – Erik 2011-03-28 12:49:00
這是一個您希望在發佈問題之前進行更多研究的場所。如果問題清晰,答案將以這樣一種方式讓你更深入地瞭解你正在尋找的東西。 – sjsam 2014-06-17 08:52:32