新手请教大神:关于多重继承,虚函数在虚表中地址方面的问题

boot_black 2018-01-18 04:38:27
先贴上代码,很简单的一个基类和继承类。
#include <iostream>

class Base1
{
public:
virtual void f() { std::cout << "Base::f()" << std::endl; }
virtual void g() { std::cout << "Base::g()" << std::endl; }
virtual void h() { std::cout << "Base::h()" << std::endl; }
};

class Base2
{
public:
virtual void f() { std::cout << "Base::f()" << std::endl; }
virtual void g() { std::cout << "Base::g()" << std::endl; }
virtual void h() { std::cout << "Base::h()" << std::endl; }
};

class Base3
{
public:
virtual void f() { std::cout << "Base::f()" << std::endl; }
virtual void g() { std::cout << "Base::g()" << std::endl; }
virtual void h() { std::cout << "Base::h()" << std::endl; }
};

class Derive : public Base1, public Base2, public Base3
{
public:
virtual void f1() { std::cout << "Derive::f1()" << std::endl; }
virtual void g1() { std::cout << "Derive::g1()" << std::endl; }
virtual void h1() { std::cout << "Derive::h1()" << std::endl; }
};




按照我的理解(如下):
内存1窗口有6个函数地址,分别对应f(),g(),h(),f1(),g1(),h1()。
内存2窗口有3个函数地址,分别对应f(),g(),h()。
内存3窗口有3个函数地址,分别对应f(),g(),h()。
为什么内存2,派生类d继承的基类Base2中有5个函数地址(前面三个是正确的,最后2个地址代表什么?),恳请指教。谢谢哈。
...全文
538 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
faihung 2018-01-18
  • 打赏
  • 举报
回复
这个编译器都有的,楼主还研究这个。
Saleayas 2018-01-18
  • 打赏
  • 举报
回复
我认为是编译器自己添加的一些,诸如 RTTI 之类的。 你可以让编译器显示一下这些地址的符号值。 把这个地址付给变量,然后查看这些变量就可以了。 我看C++ 的内存布局一直都是这么做的。
boot_black 2018-01-18
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
这取决于编译器,另外推荐你看:《深度探索c++对象模型》
恩,感谢版主指教
赵4老师 2018-01-18
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
paschen 版主 2018-01-18
  • 打赏
  • 举报
回复
这取决于编译器,另外推荐你看:《深度探索c++对象模型》
boot_black 2018-01-18
  • 打赏
  • 举报
回复
这是网上大神给出的理解(我就是按照他给的例子来练习的)
这里的Base2应该只有3个函数地址才对,不知道是我哪里弄错了。恳请指教!

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧