1

假设我有一个名为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吗?

youcantbeamember我想如果有可能从一个类中“排除”一个成员,这是最接近这样做的,因为 AFAIK在 C++中没有魔法关键字

我最好的猜测是,不,你不能这样做。但我只是希望,因为我想避免创建一个包含除Create()成员之外的所有内容的基类,CWindowCMyWindowCWindowBase.

4

2 回答 2

4

您实际上可以这样做,它会按预期工作。唯一的问题是 aCMyWindow仍然是 a 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);
};
于 2012-11-09T12:13:16.927 回答
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
    }
};
于 2012-11-09T12:37:16.753 回答