【发布时间】:2016-11-15 16:54:31
【问题描述】:
我不明白以下限制:
class Base
{
virtual doFoo() = 0;
};
class Derived : public Base
{
public:
void doStuff() { doFoo(); } //compile error, doFoo is a private member of Base
};
解决方案当然是在派生类中重新声明成员,但我觉得有点奇怪:
class Derived : public Base
{
public:
void doStuff() { doFoo(); }
private:
virtual doFoo() = 0;
};
为什么不重新声明就不能在派生类中使用基类的抽象虚拟私有方法?这似乎是过于严格的限制,因为如果我使用它但没有定义它,那么 Derived 仍然是抽象的,并且要实例化它,一些进一步的派生类必须提供 doFoo。
直观地说,通过不定义它(或重新声明它),我暗示该方法没有被使用并且不是派生类的一部分,但这对于代码的读者来说比对编译器来说更重要。或者也许编译器也确实需要这些信息,而这才是真正的原因?
【问题讨论】:
-
为什么不使用
protected?我可能错过了一些东西 -
这些是封装的基础。私人就是私人,就是这样。如果您作为类设计者想向子类公开某些内容,请使用 protected,如果您想向所有客户端(在本例中为子类)公开您的功能,请使用 public。
-
恕我直言,私有虚拟方法没有多大意义。虚拟意味着可以被子类覆盖,私有意味着不能从基类访问......你的意思是受保护吗?
-
@SergeBallesta 进一步限制访问实际上很有用。如果 Derived 实现了 doFoo,那么进一步的派生类将无法调用该实现。有了protected,他们就可以调用它了。
-
那么
Derived应该被声明为class Derived : private Base {...。并且没有进一步的派生类可以访问Derived类实现。但是在基类中将方法设为私有肯定会错过重点……嗯,这看起来确实像一个 XY 问题。请准确说明您要实现的目标
标签: c++ inheritance