簡體   English   中英

我可以從派生類中排除基類成員嗎?

[英]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()成員,並獲得CWindowCMyWindowCWindowBase

你實際上可以這樣做,它將按預期工作。 唯一的問題是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM