C++ 私有纯虚拟功能的目的?

C++ 私有纯虚拟功能的目的?,c++,virtual,private,abstract,C++,Virtual,Private,Abstract,我(希望)已经理解了私有虚拟函数的用途,但我不明白为什么我应该拥有私有纯虚拟函数! 我的意思是,我必须在所有派生类中定义这个函数,但这样,对这个虚拟纯函数的所有调用都将是对派生类中定义的函数的调用 假设我们有: class Base{ public: void foo(){ bar(); } private: virtual void bar() =0 {/*something*/} }; 基类的派生类必须定义bar(或者让它成为纯虚拟的,但暂时忘记这一点)。 因为Base::

我(希望)已经理解了私有虚拟函数的用途,但我不明白为什么我应该拥有私有纯虚拟函数! 我的意思是,我必须在所有派生类中定义这个函数,但这样,对这个虚拟纯函数的所有调用都将是对派生类中定义的函数的调用

假设我们有:

class Base{
public:
    void foo(){ bar(); }
private:
    virtual void bar() =0 {/*something*/}
};
基类的派生类必须定义bar(或者让它成为纯虚拟的,但暂时忘记这一点)。 因为Base::bar是私有的,所以派生类不能使用它。 因为Base是抽象的,所以我不能创建Base对象,所以我只能对派生类调用foo,但这意味着Base::bar永远不会被调用! 当然,我可以定义foo:

void Base::foo(){
    bar();
    Base::bar();
}
但是为了什么?用bar主体定义非虚拟私有函数(并用它替换Base::bar)并使纯虚拟函数主体为空不是更好吗

如果是这样的话,为什么我应该拥有私人酒吧(而且不受保护)

PS:我试图在互联网上找到一个解决方案,我知道有类似->的帖子,但它们有助于理解私有虚拟功能,而不是私有纯虚拟功能。如果我错了,请原谅我

当然,bar()仍然可以被
Base
类的其他成员调用

通过使bar()纯,这通常具有强制可实例化子类实现bar()或从另一个可实例化类继承的效果


也许您明确地不希望子类直接调用超类的bar(),而强制子类通过其他一些受保护的方法间接调用它,或者两个…

,因此通常模式是实现公共非虚拟函数和私有或受保护的虚拟函数,看起来你已经对此进行了研究,但这通常被称为,Herb Sutter和

是否使其纯虚拟取决于您的需求,有时绝对没有任何有意义的默认行为,或者您希望强制所有子类实现其自己版本的虚拟函数。有时空的实现是有意义的。然后提供,但发生的情况是,其他实现者可能忘记自定义他们的类,而不是实现您为其提供默认行为的虚拟类。这确实是一个个案的决定,你将不得不作出


在某些特殊情况下,您可能希望为纯虚拟函数提供一个实现,其中列出了两种,一种是提供默认行为,但强制派生类进行简洁调用,另一种是防止编译器出现可能调用纯虚拟函数的问题


在您的问题所在的地方,存在着各种各样的关注点,通常使虚拟函数私有或受保护,由公共函数调用(同样是模板方法模式)。如果派生类不需要调用超类实现,则将其设置为私有。如果要实现默认行为,请使其受到保护,并在更高的类中实现默认行为。如果您想强制子类实现自己的函数(与是否存在默认行为无关),请将其设置为纯虚拟。

virtual void bar()=0{/*something*/}
?您不必为纯虚拟函数提供定义,如果你是这么问的话。@T.C.我想你删除了我回应的评论。@NikBougalis哦,我明白你的意思了。我说的是“因为基是抽象的,我不能创建基对象,所以我只能在派生类上调用foo”。我无意建议使用纯虚拟来禁用构造。私有纯虚拟函数在NVI(非虚拟实现)中很有用,这是模板方法模式,请参见Scott Meyers的原则35。“在某些情况下,您可能希望为纯虚拟函数提供一个实现,Herb Sutter再次列出了两个,一个是提供默认行为,但强制派生类简洁地调用”,如果我保护这个纯虚拟函数(或公共函数),这个理由可能是有效的,但不是私有的。但是,第二个可能是合理的:以防万一,如果发生错误,我会知道,并将其设置为私有的,我不会让派生类使用这个“警告”函数;……此外,将其设置为纯的,我将强制派生类实现它们自己的函数(因此“警告”纯虚拟不会被继承)。最后,我将没有主体的纯虚拟函数“私有”只是因为它一般不能被调用(因为我没有定义它),从而避免了链接错误。我说的对吗?(请原谅我这么长的回答!)是的,我认为你说得对,我实际上从未向纯虚拟函数添加主体,在大多数情况下,我对受保护的虚拟对象使用模板方法。