c++ - 私有(private)纯虚函数的目的?

标签 c++ virtual private abstract

我(希望)已经理解私有(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) 提供了更多解释 herehere

是否将其设为纯虚函数取决于您的要求,有时绝对没有有意义的默认行为,或者您想强制所有子类实现该虚函数的自己版本。有时空的实现确实有意义。然后提供,但发生的情况是其他实现者可能忘记自定义他们的类,而不是实现您为其提供默认行为的虚拟类。这实际上是您必须根据具体情况做出的决定。

在某些极端情况下,您可能希望提供纯虚函数 Herb Sutter again 的实现。 ,列出了两个,一个是提供默认行为,但强制派生类有意识地调用,另一个是防止可能调用纯虚函数的编译器问题。

在您的问题所在的地方,有各种各样的问题聚集在一起,通常将虚拟函数设为私有(private)或 protected ,由公共(public)函数调用(再次模板方法模式)。如果派生类不需要调用父类(super class)实现,请将其设为私有(private)。如果您想实现默认行为,请将其保护并在更高的类中实现默认行为。如果你想强制子类实现自己的功能(无论是否有默认行为),请将其设为纯虚拟。

关于c++ - 私有(private)纯虚函数的目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597366/

相关文章:

带有 regexec() 的 C++ 正则表达式不匹配

c++ - GNU 使 : how to handle sub-projects

c# - 如何在 C# 中浏览本地虚拟文件夹?

html - 如何在同一行显示两个图像(CSS)

java - PowerMock 访问私有(private)成员

fork() 和 execl() 调用后无法识别 C++ 命令 (Linux)

c++ - 动态内存复制如何工作?

c++ - 菱形继承(钻石问题)和纯虚函数

templates - D 中的私有(private)代码生成函数?

ios - 如何转储 CoreTelephony 框架的 iOS 6 私有(private) api?