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

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

4

2 回答 2

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

有关完整示例,请参阅此现场演示

于 2013-04-22T16:35:07.503 回答
0

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

是的,但是在构造函数和析构函数中执行此操作时要小心,因为对象的类型会随着不同的构造函数/析构函数的完成而演变。特别是在Parent构造函数/析构函数的执行过程中,对象Parent的类型与被构造的整个对象的类型无关。

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

于 2013-04-22T16:46:12.953 回答