虚函数类的子类对象是否包含虚表呢?

gattuso8 2008-10-20 11:01:36
虚函数类的子类对象是否包含虚表呢?

一直不了解从虚函数类继承下来的类
是否也带着一个自己的自己父类一样的虚函数表指针

写了一个小程序测试一下

#include <iostream>
using namespace std;

class base
{
public:
base(){}
virtual void test()
{
cout<<"This is base"<<endl;
}
};

class derive : public base
{
public:
derive(){}
void test()
{
cout<<"This is derive"<<endl;
}
};

void main()
{
derive myderive;
base mybase = myderive;

mybase.test();

base mybase1;
derive myderive1;
cout<<"sizeof(mybase1)"<<sizeof(mybase1)<<endl;
cout<<"sizeof(myderive1)"<<sizeof(myderive1)<<endl;
}

编译器VC6,输入结果

This is base
sizeof(myderive)4
sizeof(mybase)4
Press any key to continue


得到两条矛盾的结论
a.如果子类对象不含有自己的虚函数表,那对于父类myderive,虚函数表作为对象里唯一的虚函数指针,指向的是一定是子类方法。
如此,为什么mybase作为直接阉割过的myderive对象应该指向父类虚方法?
b.如果子类也含有一个自己的虚拟函数表,那他们对象size确实一样的。

个人倾向于 子类对象不含有自己的虚函数表
可能是base mybase = myderive; 阉割过程中,编译器主动改了虚函数指针,指向了父类。
不知猜得对不对,求高手解释。谢谢。








...全文
310 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbd1984 2008-10-21
  • 打赏
  • 举报
回复
4楼正解!
gattuso8 2008-10-21
  • 打赏
  • 举报
回复
谢谢各位
我觉得阿荣兄所言 很有道理
另我茅塞顿开

基类对象包含有一个指针 指向具体实际的虚函数表(也可能是子类提供的虚函数)
哦 应该是这样
once_and_again 2008-10-21
  • 打赏
  • 举报
回复
我记得不包含,
是指向基类的 表吗?
有人知道不?
frisky_lobo 2008-10-21
  • 打赏
  • 举报
回复
你把base mybase = myderive;
mybase.test();
改为base ×mybase = &myderive;
mybase->test();
看看
Big鹏 2008-10-21
  • 打赏
  • 举报
回复

虚函数类的子类对象是否包含虚表呢?

子类对象包含虚表,不过是继承自父类的,与父类共享一个虚表。

在base mybase=derive调用中,mybase实际上调用其拷贝构造函数,构建一个新对象,其虚表和derive毫无关系。

给楼主推荐本书;《C++应用程序性能优化》
chlaws 2008-10-20
  • 打赏
  • 举报
回复
包含.
对虚表不了解,就找资料先混熟
arong1234 2008-10-20
  • 打赏
  • 举报
回复
派生类对象包含一个基类对象区域和派生类特有对象区域,基类是派生类的一部分。从这个意义上讲,派生类是包含虚表的,但是这个虚表是派生类对象中基类对象的那个部分,实际上,派生类对象和其内含的基类对象共享一个虚表,且虚表包含的是派生类对象的函数偏移,这就是为什么你无论用基类还是派生类指针,都调用派生类对象函数的原因。

在base mybase=aderive调用中,实际上mybase不是指向了aderive的数据区,它也不会去拷贝aderive的虚函数表部分。实际上mybase应该调用其拷贝构造函数,构建一个新对象,其虚表和aderive毫无关系。

[Quote=引用楼主 gattuso8 的帖子:]
虚函数类的子类对象是否包含虚表呢?

一直不了解从虚函数类继承下来的类
是否也带着一个自己的自己父类一样的虚函数表指针

写了一个小程序测试一下

#include <iostream>
using namespace std;

class base
{
public:
base(){}
virtual void test()
{
cout < <"This is base" < <endl;
}
};

class derive : public base
{
public:
derive(){}
void test()
{
cout < <"This is …
[/Quote]
arong1234 2008-10-20
  • 打赏
  • 举报
回复
派生类包含基类对象,虚函数表在继承树中最早定义虚函数的那个基类对象部分
sys0003 2008-10-20
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
lz看看《深入探索C++对象模型》吧

64,644

社区成员

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

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