如果我要覆盖它,我可以调用基类的虚函数吗?

新手上路,请多包涵

假设我有类 FooBar 设置如下:

 class Foo
{
public:
    int x;

    virtual void printStuff()
    {
        std::cout << x << std::endl;
    }
};

class Bar : public Foo
{
public:
    int y;

    void printStuff()
    {
        // I would like to call Foo.printStuff() here...
        std::cout << y << std::endl;
    }
};

如代码中所述,我希望能够调用我正在覆盖的基类函数。在 Java 中有 super.funcname() 语法。这在 C++ 中可能吗?

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 556
2 个回答

在 C++ 中,您必须在调用派生类方法时显式命名基类。这可以通过派生类的任何方法来完成。覆盖是同名方法的特例。在 Java 中没有多重继承,因此您可以使用 super 来唯一命名基类。 C++ 语法是这样的:

 class Bar : public Foo {
  // ...

  void printStuff() override {  // help the compiler to check
    Foo::printStuff(); // calls base class' function
  }
};

原文由 sth 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果有多个继承级别,您可以指定直接基类,即使实际实现处于较低级别。

 class Foo
{
public:
  virtual void DoStuff ()
  {
  }
};

class Bar : public Foo
{
};

class Baz : public Bar
{
public:
  void DoStuff ()
  {
    Bar::DoStuff() ;
  }
};

在此示例中,类 Baz 指定 Bar::DoStuff() 尽管类 Bar 不包含 DoStuff 的实现。这是一个细节, 巴兹 不需要知道。

显然,调用 Bar::DoStuff 比调用 Foo::DoStuff 更好,以防更高版本的 Bar 也覆盖此方法。

原文由 Phil Jollans 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题