派生类虚函数调用基类版本

 
  1. #include <iostream>

  2. using namespace std;

  3.  
  4. class Base

  5. {

  6. public:

  7. virtual void foo(void) { std::cout << "Base::foo()" << std::endl; }

  8. virtual void doo(void) { std::cout << "Base::doo()" << std::endl; }

  9. };

  10.  
  11. class Derived: public Base

  12. {

  13. public:

  14. void foo(void)

  15. {

  16. //foo(); // 错误。递归调用自己,即 Derived::foo()

  17. Base::foo(); // 明确告诉编译器,调用的是 Base::foo(), 而不是自己

  18. std::cout << "Derived::foo()" << std::endl;

  19. }

  20.  
  21. virtual void doo(void)

  22. {

  23. Base::doo();

  24. std::cout << "Derived::doo()" << std::endl;

  25. }

  26. };

  27.  
  28. class Derived2 : public Derived

  29. {

  30. virtual void doo(void)

  31. {

  32. Derived::doo();

  33. std::cout << "Derived2::doo()" << std::endl;

  34. }

  35. };

  36.  
  37. class Derived3 : public Derived2

  38. {

  39. virtual void foo(void)

  40. {

  41. Derived2::foo();

  42. std::cout << "Derived3::foo()" << std::endl;

  43. }

  44. };

  45.  
  46. int main(/* int argc, char *argv[] */)

  47. {

  48. Derived3 *d = new Derived3;

  49. Base *b = d;

  50.  
  51. b->foo();

  52. cout << "------------------------" << endl;

  53. b->doo();

  54.  
  55. b = nullptr;

  56. delete d;

  57. d = nullptr;

  58.  
  59. return 0;

  60. }

程序输出:

结论:

1.派生类虚函数调用基类版本时,必须显式使用作用域操作符。
2.多态时,在虚函数继承链上,如果某个子类没有覆盖虚函数,则调用亲缘最近的父类版本。最佳做法,还是每个子类都实现。


参考资料:

1.派生类虚函数调用基类版本

http://blog.csdn.net/glx2012/article/details/8254623

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值