在多重继承中,虚函数表的结构是怎么样的?

Vegachow 2004-12-02 04:01:02
例如一个典型的菱形继承:
class A
{
int a;
virtual void func1();
};

class A1: public A
{
int a1;
virtual void func2();
};

class A2: public A
{
int a2;
virtual void func3();
};

class B: public A1, public A2
{
int b;
virtual void func4();
};

请问类B的布局结构和它虚函数表的结构。
...全文
304 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Vegachow 2004-12-02
  • 打赏
  • 举报
回复
1
Vegachow 2004-12-02
  • 打赏
  • 举报
回复
感谢
DentistryDoctor(雅克医生<改行做程序员了>)
goodluckyxl(被人遗忘的狗)
xjw_ustb(小熊)
三位,就此结贴
xjw_ustb 2004-12-02
  • 打赏
  • 举报
回复
我学的也不好,除了B::func4()的位子可能有问题,其他的没问题。
B的布局结构:
a;
vptr;(A!的)
a1;
a;
vptr(A2的)
a2;
b;

虚函数表的结构:有两个
一个:
&A::func1();
&A!::func2();
&B::func4();
2:
&A:func1();
&A2::func3();


Borland C++编译器是这样的.我用编译器测过了,大小是28byte我的猜测应该没错
Vegachow 2004-12-02
  • 打赏
  • 举报
回复
近日在看ATL的实现,正好看到接口指针的偏移。所以想了解一下多继承的一些状况。
realsong 2004-12-02
  • 打赏
  • 举报
回复
按照 goodluckyxl(被人遗忘的狗) 所说的规律的话应该是这样的
func4
func2
func3
func1
goodluckyxl 2004-12-02
  • 打赏
  • 举报
回复
VTBL 一般紧靠在 成员后面
virtual函数一般顺序放置在VTBL
处于VTBL的起始(不过好象保留了两位空间好象在表首)
记不太清楚了

问题回答了
有几点友情提醒下:
1.如果刚学没有必要专牛角 专下去没完没了 恐怕到时候只有写编译器和设计c++才能回答你
2.即使你已经入门,自己多看看书,这些东西书上都有。一有问题就到处问这是极度不好的习惯
3.学习的时候要有针对性,如果这部分实在对你的编程有着很大影响,你必须放下转而去学习那部分
如果不是,就先跳过。对你只有好处没有坏处
carylin 2004-12-02
  • 打赏
  • 举报
回复
好像具體編譯器有點差別的
Vegachow 2004-12-02
  • 打赏
  • 举报
回复
那么class A的func1处于虚函数表的哪个位置呢?
goodluckyxl 2004-12-02
  • 打赏
  • 举报
回复
class Base
{
public:
virtual ~Base() ;
virtual void f1();
virtual void f2();
virtual void f3();

};
那么 Base中虚表内的函数指针分布如下
Base’s VTBL:
1--------------------------à Base::~Base()
2---------------------------> Base::f1()
3--------------------------à Base::f2()
4--------------------------à Base::f3()
如果有Derived继承于Base则在继承类中的VTBL的分布:所有虚函数指针位置按照声明先后依次拍放完毕至第一个出现被Derived覆盖的虚函数位置,然后拍放从类继承下来的虚函数(覆盖后位置不变)然后拍放后面的虚函数。
class Derived:public Base
{
public:
virtual ~Derived();
virtual void f0();
virtual void f2();
virtual void f4();

};

那么在Derived中位置拍放如下
1----------------------------à Derived::~Derived()
2----------------------------à Derived::f0()
3----------------------------à Base::f1() //基类的virtual函数
4----------------------------à Derived::f2()//覆盖后的
5----------------------------à Base::f3()
6----------------------------à Derived::f4()

每个类中只要有virtual函数存在就会产生一张虚表,如果很多这样的类VTBL也会站用不少的资源哦。这么多VTBL我们怎么处理它的放置位置呢?我记得不清楚了好象叫探勘还是勘探法的:将VTBL放在内含非内联,非纯虚的虚函数的声明的位置处。
healer_kx 2004-12-02
  • 打赏
  • 举报
回复
B的虚表指针与第一父类A1的VTb指针一致,然后是A2的,然后是b成员。
DentistryDoctor 2004-12-02
  • 打赏
  • 举报
回复
建议楼主阅读
Inside C++ Object Model

65,186

社区成员

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

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