簡體   English   中英

C ++多重繼承,基類可見性和可怕的鑽石。 將祖先基類重新公開為公共?

[英]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.

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