我总是看到很多虚拟函数在头文件中声明为受保护的例子。将虚拟函数声明为公共函数是错误的吗?使用虚拟函数时的最佳实践是什么?
将虚拟函数声明为公共函数是错误的吗?
不。
使用虚拟函数时的最佳实践是什么?
这完全取决于您的用例。关键字本身在使用上是正交的。
有时,像模板设计模式一样拥有protected
virtual
函数是件好事,大多数情况下,virtual
函数被声明public
以提供接口。
public
和protected
继承分为两个设计模式类别:
-
模板函数模式:
class Base { public: void foo() { bar(); }; protected: virtual void bar() = 0; }; class Implementation : public Base { void bar() { // provide the implementation } };
-
接口模式:
struct Interface { virtual void foo() = 0; virtual ~Interface() {} }; class Implementation : public Interface { public: void foo() { // provide the implementation } };
还有其他设计模式可能完全省略virtual
(请参阅 CTRP),但仍保留public
和protected
的语义。