c++ - 什么时候应该限制派生类中虚函数的可访问性?

标签 c++ virtual-functions access-specifier

考虑以下代码:

class Base
{
public:
    virtual void Foo() {}
};

class Derived : public Base
{
private:
    void Foo() {}
};

void func()
{
    Base* a = new Derived;
    a->Foo(); //fine, calls Derived::Foo()

    Derived* b = new Derived;
//  b->Foo(); //error
    static_cast<Base*>(b)->Foo(); //fine, calls Derived::Foo()
}

关于这个问题,我听到了两种不同的思想流派:

  1. 保留与基类相同的可访问性,因为用户无论如何都可以使用 static_cast 来获得访问权限。

  2. 使函数尽可能私有(private)。如果用户需要 a->Foo() 而不是 b->Foo(),那么 Derived::Foo 应该是私有(private)的。如果需要,它可以随时公开。

有理由偏爱其中之一吗?

最佳答案

限制对子类型中成员的访问会破坏 Liskov substitution principle (SOLID 中的 L)。一般来说,我会建议不要这样做。

更新:它可能“有效”,因为代码编译和运行并产生预期的输出,但如果您隐藏成员,您的意图可能正在子类型不如原始类型一般。这就是打破原则的原因。相反,如果您的意图是通过仅保留 API 用户感兴趣的内容来清理子类型接​​口,请继续这样做。

关于c++ - 什么时候应该限制派生类中虚函数的可访问性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10345892/

相关文章:

c++ - 在一个系统中关联另一个 make 实用程序时出错

c++ - 使用非虚拟接口(interface)习惯用法,我的非虚拟函数可以/将被内联吗?

ruby - Ruby 中的私有(private)模块方法

c++ - 为什么我在 Codechef 的 Faded Palindromes 中得到了一个 WA,即使我到目前为止在我的代码中没有发现任何错误并且它对我来说工作正常?

c++ - 创建包含另一个字符串的多个拷贝的字符串的最佳方法

c++ - 在我应该在哪里调用虚函数方面需要帮助

c++ - 抽象基类中私有(private)虚函数的可见性

java - 为什么子对象调用具有 main 方法的父类(super class)的私有(private)方法?

c++ - 基类的 "default"访问说明符差异的基本原理

c++ - clang 3.4 C++14 支持