这是我的基类工作的方式:
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 :(得分:9)
虚拟函数可以public
,protected
或private
访问。
通过C++ FAQ对它们进行讨论。
答案 1 :(得分:2)
他们可以是私人的,不需要公开。
答案 2 :(得分:2)
虽然它们可以公开,但它并不像Herb Sutter所说的那样被视为良好的设计原则。
答案 3 :(得分:1)
虚拟函数可以是private
。这是因为private
意味着派生类无法调用该函数。它不会阻止覆盖v表的输入。这意味着基类和派生类都可以访问被覆盖的虚函数。