当前位置: 首页 > 知识库问答 >
问题:

私有纯虚函数的目的?

诸修伟
2023-03-14

我(希望)已经明白了私有虚函数的用途,但是还没明白为什么要有私有的纯虚函数!我的意思是,我必须在所有的派生类中定义这个函数,但是这样一来,所有对这个虚拟纯函数的调用都是对在派生类中定义的函数的调用。

假设我们有:

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:我试图在互联网上找到一个解决方案,我知道有类似的帖子-

共有2个答案

虞航
2023-03-14

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

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

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

仰钧
2023-03-14

因此,一般来说,模式是实现公共非虚拟函数和私有或受保护的虚拟函数,看起来您已经对此进行了研究,但这通常被称为模板方法模式,Herb Sutter在这里和这里进行了更多解释。

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

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

在你的问题所在的点上,有各种各样的关注点聚集在一起,一般来说,使虚函数私有或受保护,由公共函数调用(又是模板方法模式)。如果派生类不需要调用超类实现,使其私有。如果你想实现默认行为,使其受到保护,并在更高的类中实现默认行为。如果你想强制子类实现自己的函数(独立于阉羊,是否有默认行为),使其纯虚拟。

 类似资料:
  • 本文向大家介绍C++中虚函数与纯虚函数的用法,包括了C++中虚函数与纯虚函数的用法的使用技巧和注意事项,需要的朋友参考一下 本文较为深入的分析了C++中虚函数与纯虚函数的用法,对于学习和掌握面向对象程序设计来说是至关重要的。具体内容如下: 首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承、动态绑定。通过数据抽象,可以使类的接口与实现分离,使

  • 本文向大家介绍虚函数与纯虚函数之间的区别,包括了虚函数与纯虚函数之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解虚拟和纯虚拟功能之间的区别。 虚函数 它在类中有自己的定义。 基类可以覆盖虚拟函数。 它没有派生类。 声明 纯虚函数 没有定义。 如果一个类至少具有一个虚函数,则可以将其声明为抽象。 派生类必须重写纯虚函数才能使用它。 通过在声明中放置“ = 0”来指定纯虚函数

  • 本文向大家介绍C++ 虚函数和纯虚函数的区别分析,包括了C++ 虚函数和纯虚函数的区别分析的使用技巧和注意事项,需要的朋友参考一下 首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函

  • 本文向大家介绍c++中虚函数和纯虚函数的作用与区别,包括了c++中虚函数和纯虚函数的作用与区别的使用技巧和注意事项,需要的朋友参考一下 虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。 纯

  • 我正在学习面向对象的C,并有一个关于虚拟/纯虚拟和多级继承的问题。 假设我有这样的简单代码: 我的理解是,除非getWidth被指定为虚拟,否则多态将使用“Base”类的函数。我的意思是r-的最终调用 在这种情况下,我注意到如果我删除Shape中的纯虚拟声明,我们会得到我刚才描述的行为。在基类中有一个纯虚函数会自动使该函数的所有定义都是虚的吗?

  • 我试着实现了一个列表容器,并决定将一些通用函数如< code>sum()移到基类,这样我就可以在其他容器中重用它们。 所有的基本支持类需要的是三个方法 empty()、 和 。我不能使这些纯粹的虚拟,因为支持类永远不会被实例化。但它仍然必须使用这些方法来实现自己的方法,如 我试过这样的东西: 但是尝试使用< code>sum()会导致编译错误 对于、和中的每一个。 有什么建议吗?