#include <iostream>
using namespace std;
class Base
{
public:
virtual void foo(void) { std::cout << "Base::foo()" << std::endl; }
virtual void doo(void) { std::cout << "Base::doo()" << std::endl; }
};
class Derived: public Base
{
public:
void foo(void)
{
//foo(); // 错误。递归调用自己,即 Derived::foo()
Base::foo(); // 明确告诉编译器,调用的是 Base::foo(), 而不是自己
std::cout << "Derived::foo()" << std::endl;
}
virtual void doo(void)
{
Base::doo();
std::cout << "Derived::doo()" << std::endl;
}
};
class Derived2 : public Derived
{
virtual void doo(void)
{
Derived::doo();
std::cout << "Derived2::doo()" << std::endl;
}
};
class Derived3 : public Derived2
{
virtual void foo(void)
{
Derived2::foo();
std::cout << "Derived3::foo()" << std::endl;
}
};
int main(/* int argc, char *argv[] */)
{
Derived3 *d = new Derived3;
Base *b = d;
b->foo();
cout << "------------------------" << endl;
b->doo();
b = nullptr;
delete d;
d = nullptr;
return 0;
}
程序输出:
结论:
1.派生类虚函数调用基类版本时,必须显式使用作用域操作符。
2.多态时,在虚函数继承链上,如果某个子类没有覆盖虚函数,则调用亲缘最近的父类版本。最佳做法,还是每个子类都实现。
参考资料:
1.派生类虚函数调用基类版本