#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.派生類虛函數調用基類版本
http://blog.csdn.net/glx2012/article/details/8254623
新聞熱點
疑難解答