【发布时间】:2012-05-07 22:07:37
【问题描述】:
考虑以下代码:
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) 使函数尽可能私有。如果用户需要 a->Foo() 而不是 b->Foo(),那么 Derived::Foo 应该是私有的。如果需要,它总是可以公开的。
有理由偏爱其中一个吗?
【问题讨论】:
-
由于您提到的原因,这种设计非常违反直觉。除非您遇到只能通过这种方式解决的情况,否则我建议您不要这样做。
-
如果您的意图是限制 直接 使用派生类(例如工厂模式),那么受保护或私有 继承 是更合适的方式(而不是限制特定的方法)
标签: c++ virtual-functions access-specifier code-design