我(希望)已经理解私有(private)虚函数的目的,但我不明白为什么我应该有一个私有(private)纯虚函数! 我的意思是,我必须在所有派生类中定义此函数,但这样,对此虚拟pure 的所有调用都将是对派生类中定义的函数的调用。
假设我们有:
class Base{
public:
void foo(){ bar(); }
private:
virtual void bar() =0 {/*something*/}
};
Base 的派生类必须定义 bar(或者使其成为纯虚拟的,但暂时忘记这一点)。 因为 Base::bar 是私有(private)的,所以派生类不能使用它。 因为 Base 是抽象的,所以我无法创建 Base 对象,因此我只能在派生类上调用 foo ,但这意味着 Base::bar 永远不会被调用! 当然,我可以定义 foo:
void Base::foo(){
bar();
Base::bar();
}
但是为了什么?用 bar 的主体定义一个非虚拟私有(private)函数(并用它替换 Base::bar),并将纯虚拟的主体清空不是更好吗?
如果是这样,为什么我应该将 bar 设为私有(private)(而不是 protected )?
PS:我尝试在互联网上找到解决方案,我知道有类似 -> C++: Private virtual functions vs. pure virtual functions 的帖子,但它们有助于理解私有(private)虚函数,而不是私有(private) PURE 虚函数。如果我错了,请原谅我!
最佳答案
所以一般来说,该模式是实现公共(public)非虚拟函数和私有(private)或 protected 虚拟函数,看起来您已经研究过这一点,但这通常被称为 Template Method Pattern ,赫伯·萨特 (Herb Sutter) 提供了更多解释 here和 here 。
是否将其设为纯虚函数取决于您的要求,有时绝对没有有意义的默认行为,或者您想强制所有子类实现该虚函数的自己版本。有时空的实现确实有意义。然后提供,但发生的情况是其他实现者可能忘记自定义他们的类,而不是实现您为其提供默认行为的虚拟类。这实际上是您必须根据具体情况做出的决定。
在某些极端情况下,您可能希望提供纯虚函数 Herb Sutter again 的实现。 ,列出了两个,一个是提供默认行为,但强制派生类有意识地调用,另一个是防止可能调用纯虚函数的编译器问题。
在您的问题所在的地方,有各种各样的问题聚集在一起,通常将虚拟函数设为私有(private)或 protected ,由公共(public)函数调用(再次模板方法模式)。如果派生类不需要调用父类(super class)实现,请将其设为私有(private)。如果您想实现默认行为,请将其保护并在更高的类中实现默认行为。如果你想强制子类实现自己的功能(无论是否有默认行为),请将其设为纯虚拟。
关于c++ - 私有(private)纯虚函数的目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597366/