考虑以下代码:
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()
}
关于这个问题,我听到了两种不同的思想流派:
保留与基类相同的可访问性,因为用户无论如何都可以使用 static_cast
来获得访问权限。 使函数尽可能私有(private)。如果用户需要 a->Foo() 而不是 b->Foo(),那么 Derived::Foo 应该是私有(private)的。如果需要,它可以随时公开。
有理由偏爱其中之一吗?
最佳答案
限制对子类型中成员的访问会破坏 Liskov substitution principle (SOLID 中的 L)。一般来说,我会建议不要这样做。
更新:它可能“有效”,因为代码编译和运行并产生预期的输出,但如果您隐藏成员,您的意图可能正在子类型不如原始类型一般。这就是打破原则的原因。相反,如果您的意图是通过仅保留 API 用户感兴趣的内容来清理子类型接口,请继续这样做。
关于c++ - 什么时候应该限制派生类中虚函数的可访问性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10345892/