假设我有一个名为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
。< / p>
答案 0 :(得分:4)
你可以实际执行此操作,它将按预期工作。唯一的问题是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);
};
答案 1 :(得分:0)
您似乎公开继承了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
}
};