[英]C++ Multiple inheritence, base class visibility and the dreaded diamond. Re-exposing ancestor base class as public?
我需要通過使其受保護來從基類中抽象出很多接口,但我還需要公共訪問一個簡單的祖先類Object
。 我是否可以在沒有對這些祖先進行寫入/編輯訪問的情況下協商可怕的鑽石 ,並且仍然只提供基本API但是再次公開Object
的API?
class Object {
virtual bool Equals (const Object &obj) const;
virtual int GetHashCode (void) const;
};
class ComplicatedOne : public Object {
//Lots of funcs I don't want or need.
};
class Line : protected ComplicatedOne, public Object {
//Some funcs of ComplicatedOne get re-implemented or called by alias here
public:
virtual bool Equals(const Object &obj) const {
return Object::Equals(obj);
}
virtual int GetHashCode() const {
return Object::GetHashCode();
}
};
class Array {
void Add (Object &obj);
Object *GetAt (int i);
};
main() {
Array a;
a.Add(new Line());
}
你可以使用構圖。
您可以將ComplicatedOne
的實例作為成員保存,並公開您需要的內容。
這樣你可以保護它,但永遠不會有鑽石情況。
此外,如果ComplicatedOne
是一個Object
,那么Line
是一個繼承的Object
,因此您不需要再次繼承。
你對你真正的問題非常模糊,但對我而言,聽起來好像你只想使用繼承來獲得代碼重用。
你不應該這樣做。 看看這篇文章 。
對我來說,聽起來好像構圖更多地是您想要的。 在類Line中創建ComplicatedOne
的成員,並將調用委派給該成員。 然后,您無需繼承它。
return Object::Equals(obj);
那是無法編譯的,因為它含糊不清: 有兩個Object
基礎對象。
此外,從Line*
到Object*
轉換是不明確的,並且不能將歧義解析為第二個Object
基類(從左到右的基類順序),因此除了創建困難之外,第二個Object
base不起任何作用。
目前尚不清楚您正在嘗試做什么: ComplicatedOne
類代表什么? 如果要再次覆蓋每個Object
虛函數,為什么要繼承它呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.