我不明白以下限制:
class Base
{
virtual doFoo() = 0;
};
class Derived : public Base
{
public:
void doStuff() { doFoo(); } //compile error, doFoo is a private member of Base
};
Run Code Online (Sandbox Code Playgroud)
解决方案当然是重新声明派生类中的成员,但对我来说似乎有点奇怪:
class Derived : public Base
{
public:
void doStuff() { doFoo(); }
private:
virtual doFoo() = 0;
};
Run Code Online (Sandbox Code Playgroud)
为什么我不能在派生类中使用基类的抽象虚拟私有方法而不重新声明它?这似乎是过于严格的限制,因为如果我使用它但没有定义它,那么Derived
它仍然是抽象的,并且要实例化它,必须提供一些进一步的派生类doFoo
。
直观上,我想说,通过不定义它(或重新声明它),我意味着该方法未被使用,并且不是派生类的一部分,但这更多的是对于代码的读者而不是编译器。或者也许编译器也需要这些信息,这就是真正的原因?
小智 5
私有基类函数不能在派生类方法中直接调用。然而,派生类的这种不可访问性与派生类的虚拟调用机制没有任何关系。
\n在某些情况下这是可取的。摘自C++ 常见问题解答。
\n\n\n您可能会问,派生类可以\xe2\x80\x99t 调用的方法有什么好处?即使派生类不能在基类中调用它,基类也可以调用它,从而有效地向下调用(适当的)派生类。这就是模板方法模式的全部内容。
\n想想 \xe2\x80\x9c 回到未来。\xe2\x80\x9d 假设基类是去年编写的,并且您将在今天晚些时候创建一个新的派生类。基类\xe2\x80\x99 方法可能在几个月前就已编译并放入库中,将调用私有(或受保护)虚拟,这将有效地 \xe2\x80\x9ccall 到未来\xe2\ x80\x9d - 几个月前编译的代码将调用 \xe2\x80\x99 尚不存在的代码 - 您将在接下来的几分钟内编写的代码。您可以\xe2\x80\x99t 访问基类的私有成员 - 您可以\xe2\x80\x99t 到达过去,但过去可以到达未来并调用您没有\xe2\x80\x99t 的方法甚至还没写。
\n