详谈C++虚函数表那回事(多重继承关系)

上一篇说了一般继承,也就是单继承的虚函数表,接下来说说多重继承的虚函数表:

1.无虚函数覆盖的多重继承:

代码:

  1. #pragma once
  2. //无覆盖,多重继承
  3. class Base1
  4. {
  5. public: //三个虚函数
  6. virtual void f() { cout << "Base1::f" << endl; }
  7. virtual void g() { cout << "Base1::g" << endl; }
  8. virtual void h() { cout << "Base1::h" << endl; }
  9. };
  10. class Base2
  11. {
  12. public: //三个虚函数
  13. virtual void f() { cout << "Base2::f" << endl; }
  14. virtual void g() { cout << "Base2::g" << endl; }
  15. virtual void h() { cout << "Base2::h" << endl; }
  16. };
  17. class Base3
  18. {
  19. public: //三个虚函数
  20. virtual void f() { cout << "Base3::f" << endl; }
  21. virtual void g() { cout << "Base3::g" << endl; }
  22. virtual void h() { cout << "Base3::h" << endl; }
  23. };
  24. //多重继承无覆盖
  25. class Derive :public Base1 , public Base2 , public Base3
  26. {
  27. public:
  28. virtual void f1() { cout << "Derive::f1" << endl; }
  29. virtual void g1() { cout << "Derive::g1" << endl; }
  30. virtual void h1() { cout << "Derive::h1" << endl; }
  31. };
  32. void Test()
  33. {
  34. Derive d;
  35. }
cpp运行
调试结果:

可得:

1》每个父类都有虚表;

2》同样问题,虚表中没有体现出子类的虚函数;见真实内容:

可见子类的虚函数在按基类声明顺序的第一个基类的虚表中,且在此基类虚函数之后;

2.有虚函数覆盖的多重继承:

代码:

  1. #pragma once
  2. //有虚函数覆盖的多重继承
  3. #pragma once
  4. //无覆盖,多重继承
  5. class Base1
  6. {
  7. public: //三个虚函数
  8. virtual void f() { cout << "Base1::f" << endl; }
  9. virtual void g() { cout << "Base1::g" << endl; }
  10. virtual void h() { cout << "Base1::h" << endl; }
  11. };
  12. class Base2
  13. {
  14. public: //三个虚函数
  15. virtual void f() { cout << "Base2::f" << endl; }
  16. virtual void g() { cout << "Base2::g" << endl; }
  17. virtual void h() { cout << "Base2::h" << endl; }
  18. };
  19. class Base3
  20. {
  21. public: //三个虚函数
  22. virtual void f() { cout << "Base3::f" << endl; }
  23. virtual void g() { cout << "Base3::g" << endl; }
  24. virtual void h() { cout << "Base3::h" << endl; }
  25. };
  26. //多重继承无覆盖
  27. class Derive :public Base1, public Base2, public Base3
  28. {
  29. public:
  30. virtual void f() { cout << "Derive::f" << endl; } //唯一一个覆盖的子类函数
  31. virtual void g1() { cout << "Derive::g1" << endl; }
  32. virtual void h1() { cout << "Derive::h1" << endl; }
  33. };
  34. void Test()
  35. {
  36. Derive d;
  37. Base1 *b1 = &d;
  38. Base2 *b2 = &d;
  39. Base3 *b3 = &d;
  40. b1->f(); //Derive::f()
  41. b2->f(); //Derive::f()
  42. b3->f(); //Derive::f()
  43. b1->g(); //Base1::g()
  44. b2->g(); //Base2::g()
  45. b3->g(); //Base3::g()
  46. }
cpp运行
运行结果:

其实底层是这样的:

分析:

1》每个父类的虚表中原本存放f()函数的地方,被子类的f()函数覆盖;

2》其余不变;(意思是,还有没被用来覆盖的子类虚函数,任然在首个父类虚函数表的后边位置)

见图:

赐教!

转载于:https://www.cnblogs.com/li-ning/p/9489966.html

登录后您可以享受以下权益:

×
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
点击体验
DeepSeekR1满血版
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部