Jon*_*Jon 5 c++ virtual-functions access-specifier code-design
请考虑以下代码:
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()
}
Run Code Online (Sandbox Code Playgroud)
关于此事,我听过两种不同的思想流派:
1)保持可访问性与基类相同,因为用户无论如何都可以使用static_cast来获取访问权限.
2)使功能尽可能私密.如果用户需要a-> Foo()而不是b-> Foo(),那么Derived :: Foo应该是私有的.如果需要,它总是可以公开.
是否有理由偏好其中一个?
限制对子类型中成员的访问会破坏Liskov替换原则(SOLID中的L ).总的来说,我会反对它.
更新:它可能"工作",因为代码编译并运行并产生预期的输出,但如果你隐藏了一个成员,你的意图可能是使子类型不如原始子类型.这就是打破原则的原因.相反,如果您打算通过仅留下API用户感兴趣的内容来清理子类型接口,请继续执行.
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |