使用具有虚拟功能的受保护或公共功能



我总是看到很多虚拟函数在头文件中声明为受保护的例子。将虚拟函数声明为公共函数是错误的吗?使用虚拟函数时的最佳实践是什么?

将虚拟函数声明为公共函数是错误的吗?

不。

使用虚拟函数时的最佳实践是什么?

这完全取决于您的用例。关键字本身在使用上是正交的。

有时,像模板设计模式一样拥有protected virtual函数是件好事,大多数情况下,virtual函数被声明public以提供接口。

publicprotected继承分为两个设计模式类别:

  1. 模板函数模式:

    class Base {
    public:
        void foo() {
            bar();
        };
    protected:
        virtual void bar() = 0;
    };
    class Implementation : public Base {
         void bar() {
             // provide the implementation
         }
    };
    
  2. 接口模式:

    struct Interface {
        virtual void foo() = 0;
        virtual ~Interface() {}
    };
    class Implementation : public Interface {
    public:
         void foo() {
             // provide the implementation
         }
    };
    

还有其他设计模式可能完全省略virtual(请参阅 CTRP),但仍保留publicprotected的语义。

最新更新