2014-02-25 68 views
0
struct IA 
{ 
    virtual void Init() = 0; 
    ..... 
}; 

struct A : public IA 
{ 
    void Init() {}; 
    ..... 
}; 

struct B : public A 
{ 
    int Init() { return 1; }; 
}; 

有了這樣的設計,我得到錯誤C2555:「B ::初始化」:重寫虛函數返回類型...隱瞞在派生類接口基類的特定功能

我能以某種方式掩蓋初始化()來自A,我不想隱瞞其他A的功能。 A級不僅通過B級而從其他地方用作A級。

編輯:我需要在層次結構中有兩個初始函數,只有返回類型不同。 我不需要A :: Init來調用B類型的對象。 其實我可以通過

struct B : private A 
{ 
    using A::.... // all, except Init 
    int Init() { return 1; }; 
}; 

做,但在一:(

+0

你不完全清楚你想完成什麼。 – Brian

+1

也許你的'Init'函數不應該是虛擬的。 – Brian

+0

@布賴恩比,你可以把它作爲答案,並將它。但是,現在它對我來說很有趣,至於樂趣。所以,任何其他答案表示讚賞。 – Yola

回答

1

由於遺傳有很大的功能很多,你struct B包含函數簽名void Init();int Init();和C++不允許重載方法只在不同的返回類型

可能不雅的解決方案:

  • 您可以通過將中的void Init();方法聲明爲私有方法,並將您希望作爲公共繼承的其餘方法進行保留來修復此錯誤。
  • 另一個解決方法是添加一個虛擬參數,如bool,並使用Init(true)調用該方法。請注意,您無法爲此虛擬參數定義默認值,否則最終會出現相同的錯誤。