我可以从派生类中排除基类成员吗?

时间:2012-11-09 12:06:33

标签: c++ oop inheritance polymorphism virtual

假设我有一个名为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派生CMyWindowCWindowBase。< / p>

2 个答案:

答案 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
    }
};