繁体   English   中英

是否可以从超类实现中调用子类虚拟函数?

[英]Is it possible to call a subclass virtual function from within superclass implementation?

#include <iostream>

using namespace std;

class Parent
{
public:
    Parent() {}
    virtual void foo() { cout << "My favorite song is:"; bar(); }
    virtual void bar() {}
};

class Child : public Parent
{
public:
    Child() : Parent() {}
    virtual void bar() { cout << "Singing in the Rain"; }
    void baz() { Parent::foo(); }
};

int main()
{
      Child().baz(); // Outputs "My favorite song is: Singing in the Rain"
      return 0;
}

答案是肯定的。 上面的代码按预期工作。

是否可以从超类实现中调用子类虚拟函数?

当然有可能。 但是您实际上需要建立该继承关系。 例如:

class Child : public Parent
//          ^^^^^^^^
//          For instance...
{
public: // Make at least baz() accessible from the outside
    // ...
}; // <== And don't forget the semicolon here

而且,如果必须由Child调用它们,则还需要赋予基类中的成员函数适当的可访问性:

class Parent
{
public: // <== For instance, you could make the member functions public
    virtual void foo() { cout << "My favorite song is:"; bar(); }
    virtual void bar() {}
}; // <== Do not forget this

有关完整示例,请参见此实时演示

是否可以从超类实现中调用子类虚拟函数?

是的,但是要从构造函数和析构函数中进行此操作,请注意,因为对象的类型会随着不同的构造函数/析构函数的完成而演变。 特别是在执行Parent构造函数/析构函数期间,无论所构造的整个对象的类型如何,对象的类型都是Parent

代码中有一些气味(除了编译器将捕获的明显语法错误和缺乏继承性)。 例如, foo是基础中的虚函数,但是在Child::baz的实现中,您显式调用了该覆盖(即,禁用动态调度),这可能是有意的(您可以仅调用foo() )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM