将 protected 或 public 与虚函数一起使用?

Using protected or public with virtual function?

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

Is it wrong to declare virtual functions as public?

没有

What is the best practice when using virtual functions?

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

有时像 template design pattern 一样有 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 的语义。