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ますか?

AFAIKにはyoucantbeamemberC++に魔法のキーワードがないため、クラスからメンバーを「除外」することが可能である場合、これが最も近いと思います。

私の最善の推測は、いいえ、あなたはこれを行うことはできないということです。しかし、メンバー以外のすべてを含む基本クラスを作成したり、からCreate()派生CWindowしたりすることは避けたいので、私はただ望んでいます。CMyWindowCWindowBase

4

2 に答える 2

4

実際にこれを行うことができ、期待どおりに機能します。唯一の問題は、aCMyWindowがまだaCWindowであるということです。これにより、次のことが可能になります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 に答える