虚拟功能必须公开吗?

时间:2010-10-08 01:17:32

标签: c++

这是我的基类工作的方式:

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,则调用虚函数和函数指针。

当我创建派生类时,我的虚函数是否能够再次进入私有范围,还是必须公开?

我想避免因为我的设计而被公开。 感谢

4 个答案:

答案 0 :(得分:9)

虚拟函数可以publicprotectedprivate访问。

通过C++ FAQ对它们进行讨论。

答案 1 :(得分:2)

他们可以是私人的,不需要公开。

答案 2 :(得分:2)

虽然它们可以公开,但它并不像Herb Sutter所说的那样被视为良好的设计原则。

答案 3 :(得分:1)

虚拟函数可以是private。这是因为private意味着派生类无法调用该函数。它不会阻止覆盖v表的输入。这意味着基类和派生类都可以访问被覆盖的虚函数。