关于虚函数与虚继承

daliu669 2006-12-13 09:44:49
class A
{
public:virtual void a();
};

class B : public virtual A
{
public:virtual void b();
};

class C : public A
{
public: virtual void c();
};

请问sizeof(B)和sizeof(C)各是多少?

...全文
306 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
eqxu 2006-12-18
  • 打赏
  • 举报
回复
请查看http://blog.csdn.net/fisker0303/ C++对象布局及多态实现的探索
Writer 2006-12-13
  • 打赏
  • 举报
回复
虚继承是什么?
xcsjava 2006-12-13
  • 打赏
  • 举报
回复
拥有纯虚函数的为抽象类;(或者虚基类?)
class A
{
public:virtual void a()=0; //改造成纯虚函数
};

class B : public virtual A
{
public:virtual void b();
};

输出结果一样。我认为原理一样。

一个类的对象实例包含,成员变量和虚函数表指针vptr;
虚基类也不例外。它也按照这个原理。。。。。。。个人看法。。

daliu669 2006-12-13
  • 打赏
  • 举报
回复
看看多重继承里的虚基类
xcsjava 2006-12-13
  • 打赏
  • 举报
回复
可B是虚继承啊 难道没有影响吗?
这里面怎么有虚继承?继承只有三类阿?你说的纯虚函数?还是其他?
daliu669 2006-12-13
  • 打赏
  • 举报
回复
可B是虚继承啊 难道没有影响吗?
xcsjava 2006-12-13
  • 打赏
  • 举报
回复
问题如下; vptr到底是C++编译器提供的,还是C++提供的。????
----------------答案。-----

而virtual函数是由类对象的一个指向vtbl(虚函数表)的指针vptr来进行支持。而vptr的设定和重置由类的构造函数、析构函数以及copy assignment运算符自动完成。
xcsjava 2006-12-13
  • 打赏
  • 举报
回复
有了问题我打算把它搞清楚。到底怎么回事
问题如下; vptr到底是C++编译器提供的,还是C++提供的。????
。《深度探索C++对象模型》 我打算去参考一下,
结果搜索不到,谁有下载地址,贴一个,谢谢了。
  • 打赏
  • 举报
回复
为什么 vptr 的长度是4字节
因为编译器说,vptr是4个字节,所以就是4个字节
ivenher 2006-12-13
  • 打赏
  • 举报
回复
C++作者好像说使用vptr是一种实现方法,不过常规说应该是有这么个东西,因此应该是 4
taodm 2006-12-13
  • 打赏
  • 举报
回复
去看《深度探索C++对象模型》。C++标准没有说过vptr是4字节,甚至没有说过必须要有vptr。
xcsjava 2006-12-13
  • 打赏
  • 举报
回复
为什么 vptr 的长度是4字节。谁知道???
xcsjava 2006-12-13
  • 打赏
  • 举报
回复
虚拟函数的原理:
一个类的对象实例包含,成员变量和虚函数表指针vptr;
由此可知。
类a 包含一个虚函数表指针 4个字节
b 继承a 长度和a一样
同理c 继承b 和b长度一样
具体不知道a的大小,不过确定的是sizeof(b)==sizeof(c)
我的机子的试验结果为:
sizeof(A)==sizeof(b)==sizeof(c)==4
为了验证 :改写如下
class A
{
public:
int m_data1;
virtual a(){};
};
class B:public A
{
public:
virtual b(){};
};
class C:public B
{
public:
int m_data2;
virtual c(){};
};

输出为 sizeof(A)==8
sizeof(b)==8
sizeof(c)==12
由此验证
一个类的对象实例包含,成员变量和虚函数表指针vptr;是正确的
a 包含int m_data1 长度4 +vptr长度4 ==8
b没有成员变量长度继承a 
c长度继承b的基础上8+自己的变量m_data2==12

taodm 2006-12-13
  • 打赏
  • 举报
回复
每个编译器不一定相同。你的系统算出来多少就多少。
Cemondd 2006-12-13
  • 打赏
  • 举报
回复
虚拟继承对象布局如下:1.一个指向某个表格的指针,该表格包含其虚基类子对象的地址或是某种索引关系;2.继承自其虚基类的东西;3.编译器所做的对齐.具体各个编译器实现不一样,我的vc6得出sizeof(B)为12字节.
  • 打赏
  • 举报
回复
vptr到底是C++编译器提供的,还是C++提供的。????
编译器提供实现的方式之一
C++只规定了多态,没有规定如何实现

64,654

社区成员

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

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