我(希望)已经理解了私有虚函数的目的,但我还没理解为什么我应该有一个私有的纯虚函数! 我的意思是,我必须在所有派生类中定义此函数,但这样对所有对此虚拟 pure 的调用都将调用派生中定义的那个。
假设我们有:
class Base{
public:
void foo(){ bar(); }
private:
virtual void bar() =0 {/*something*/}
};
Base的派生类必须定义bar(或者让它为纯虚拟,但暂时忘记这一点)。 因为Base :: bar是私有的,所以派生类不能使用它。 因为Base是抽象的,所以我不能创建Base对象,因此我只能在派生类上调用foo,但这意味着永远不会调用Base :: bar! 当然,我可以定义foo:
void Base::foo(){
bar();
Base::bar();
}
但为了什么?使用bar的主体定义非虚拟私有函数(并用它替换Base :: bar)并使纯虚拟的主体变空是不是更好?
如果是这样,我为什么要私人酒吧(而不是受保护的)?
PS:我试图在互联网上找到解决方案,我知道有一些帖子,比如 - > C++: Private virtual functions vs. pure virtual functions,但它们有助于理解私有虚函数,而不是私有PURE虚函数。如果我错了,请原谅我!
答案 0 :(得分:1)
所以一般来说,模式是实现公共非虚函数和私有或受保护的虚函数,看起来你已经研究过这个,但这通常称为Template Method Pattern,有更多解释作者:Herb Sutter here和here。
是否使其成为纯虚拟取决于您的要求,有时绝对没有合理的默认行为,或者您想强制所有子类实现它们自己的虚拟函数版本。有时空的实现确实有意义。然后提供,但会发生的是其他实现者可能忘记自定义他们的类,而不是实现您提供默认行为的虚拟类。这是一个案例决定,你必须做出决定。
在某些极端情况下,您需要为纯虚函数Herb Sutter again提供实现,列出两个,一个用于提供默认行为,但强制派生类可以有意识地调用,另一个是防止可能获得名为的纯虚函数的编译器问题。
在您的问题所在的地方汇集了各种各样的问题,通常使虚拟函数变为私有或受保护,由公共函数调用(再次模板方法模式)。如果派生类不需要调用超类实现,请将其设为私有。如果要实现默认行为,请将其保护并在更高级别中实现默认行为。如果你想强制子类实现他们自己的函数(独立于默认行为或不存在默认行为),请将其设为纯虚拟。
答案 1 :(得分:0)
bar()仍然可以被Base
类的其他成员调用。
通过使bar()纯,这具有强制实例化子类实现bar()或从另一个可实例化类继承的通常效果。
也许您显然不希望子类直接调用超类的bar(),并强制子类通过其他一些受保护的方法间接调用它,或者两个......