2010-10-08 120 views
2

這裏是我有我的基類的工作方式:虛擬功能是否必須公開?

class AguiWidgetBase 
{ 
    //variables 
    AguiDockingEnum dockingStyle; 
    std::string text; 
    AguiRectangle clientRectangle; 
    AguiColor tintColor; 
    AguiColor fontColor; 
    std::map<int,int,CmpIntInt> children; 

    //private methods 
    void zeroMemory(); 
    virtual void onPaint(); 
    virtual void onAddChildControl(AguiWidgetBase *control); 
    virtual void onTintColorChanged(AguiColor color); 
    virtual void onDockingStyleChanged(AguiDockingEnum style); 
    virtual void onTextChanged(std::string text); 
    virtual void onThemeChanged(const AguiTheme &theme); 
    void (*onPaintCallback)(AguiRectangle clientRect); 
    void (*onTintColorChangedCallback)(); 
    void (*onDockingStyleChangedCallback)(); 
    void (*onTextChangedCallback)(); 
    void (*onThemeChangedCallback)(); 

protected: 
    AguiWidgetBase *parentWidget; 
public: 
    AguiWidgetBase(void); 
    ~AguiWidgetBase(void); 

    void addChildControl(AguiWidgetBase *control); 
    void removeChildControl(AguiWidgetBase *control); 
    AguiWidgetBase* getParent(); 
    void paint(); 
    void setTintColor(AguiColor color); 
    AguiColor getTintColor(); 
    void setDockingStyle(AguiDockingEnum style); 
    AguiDockingEnum getDockingStyle(); 
    void setText(std::string text); 
    std::string getText(); 
    void SetTheme(const AguiTheme &theme); 
}; 

他們中的一些像這樣工作。有一個常規的不可覆蓋的函數,如果其不爲NULL,則調用虛函數和函數指針。

當我創建派生類或者它們必須是公共的時,我的虛擬函數是否能夠再次進入私有範圍?

我想避免它們因我的設計而被公開。 謝謝

+0

如果您願意,您可以創建一個虛擬功能。而且,這看起來像是一個不必要的複雜設計。你想用它來完成什麼? – JoshD 2010-10-08 01:21:10

+0

好,它是因爲我想事件處理程序,因此函數指針,用戶將能夠通過addHandler操作功能 – jmasterx 2010-10-08 01:24:41

+0

@JoshD的想法設置回調是例如: 常規的非重寫漆調用虛擬顏料,然後調用事件處理程序(函數指針(如果已設置)) – jmasterx 2010-10-08 01:25:52

回答

2

他們可以是私人的,不需要公開。

+1

我敢肯定,他們不能是私有的,因爲再沒有什麼可以替代它們。 – 2010-10-08 01:21:14

+0

@Daniel:也許令人驚訝,他們即使它們是私有被覆蓋。 (有關虛擬功能細節的更多討論,請參見此處:http://www.gotw。ca/publications/mill18.htm) – sth 2010-10-08 01:29:50

+0

@Daniel T .:你仍然可以在派生類中覆蓋私有虛擬方法。你不能做的是調用基類的版本。 – aschepler 2010-10-08 01:31:25

1

虛擬函數可以是private。這是因爲private意味着函數不能被派生類調用。它不會阻止進入v表被覆蓋。這意味着基類和派生類都可以訪問被覆蓋的虛函數。

2

雖然它們可以是公開的,但它並不像Herb Sutter所說的那樣被認爲是良好的設計原則。