[英]Can I exclude a base class member from the derived class?
假設我有一個名為CWindow
的類:
class CWindow
{
public:
virtual bool Create();
};
在派生類CMyWindow
,我想將Create(void)
方法重載為Create(int someParam)
,但是,我不希望用戶能夠調用Create(void)
方法,只有Create(int someParam)
。 這可能嗎? 我可以這樣做:
class CMyWindow : public CWindow
{
private:
bool Create();
public:
virtual bool Create(int someParam);
};
這有效嗎? 它是否會使CWindow
的前公開成員成為CMyWindow
的私人成員?
我想如果可以從一個類中“排除”一個成員,那么這最接近這樣做,因為AFAIK在C ++中沒有神奇的youcantbeamember
關鍵字
我最好的猜測是,不,你不能這樣做。 但我只是希望,因為我想避免的是擁有一切除了基類Create()
成員,並獲得CWindow
和CMyWindow
從CWindowBase
。
你實際上可以這樣做,它將按預期工作。 唯一的問題是CMyWindow
仍然是CWindow
,它允許Create()
:
CMyWindow w;
w.Create(); // does not compile
static_cast<CWindow>(w).Create(); // compiles just fine
如果您不想不惜任何代價允許這樣做,那么您必須使CWindow::Create
抽象並可能提供當前實現(如果有)作為派生類可以顯式調用的protected
成員:
class CWindow
{
public:
virtual bool Create() = 0;
protected:
bool DefaultCreateImplementation();
};
class CNormalWindow : public CWindow
{
public:
bool Create() { return DefaultCreateImplementation(); }
}
class CMyWindow : public CWindow
{
private:
virtual bool Create(); // declared but not defined
// if called by accident will produce linker error
public:
virtual bool Create(int someParam);
};
您似乎公開繼承了CWindow繼承其實現。 在使用公共繼承時,這不應該是您的意圖。 公共繼承意味着繼承接口。 但是你不想繼承CWindows接口,你要隱藏它!
想想這樣的替代設計
class Window
{
public:
// EVERY Window can create the window using this method
virtual bool Create();
};
class MyWindow : public Window
{
public:
// Initialize MyWindow with an additional parameter,
// that is used to create the window
MyWindow(int param);
// Create the window using the parameter
virtual bool Create() override;
private:
int param;
};
class View
{
public:
void AddWindow(Window& window)
{
myWindows.Add(&window);
window.Create(); // I can call this on EVERY Window instance
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.