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

时间:2013-04-22 16:31:59

标签: c++ polymorphism

#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;
}

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

2 个答案:

答案 0 :(得分:2)

  

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

当然可以。但是你需要实际建立继承关系。例如:

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

有关完整示例,请参阅此live demo

答案 1 :(得分:0)

  

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

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

代码中有几个气味(除了编译器会捕获的明显的语法错误和缺少继承)。例如,foo是基础中的虚函数,但在Child::baz的实现中,您明确地调用了覆盖(即禁用动态调度),这可能是有意或无意的(您可以调用foo())。