#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;
}
答案是肯定的。上面的代码按预期工作。
答案 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()
)。