返回信息流#include "iostream"
using namespace std;
class A{
public:
virtual void f1(){};
};
class B: public virtual A{
virtual void f2(){};
};
int main(){
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
}
这个程序在32位机器上,打印的是4和12
类A的大小应该是4没问题,一个指针的大小,指向虚函数表的指针。
但是B的大小为什么是12呢?类B应该有一个虚函数的指针和一个指向虚基类的指针,我觉得大小应该是8啊。网上搜的例子介绍不够详细。请问谁能详细的讲一下吗?多谢!!。。
这是一条镜像帖。来源:北邮人论坛 / cpp / #81665同步于 2014/8/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于C++虚拟继承的问题请教
saka123
2014/8/23镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我也是刚看虚继承,回答不正确欢迎指正:
每个类产生指向虚函数的指针,放到虚函数表中(表中存放指向各个虚函数的指针)。每个类有一个直线虚函数表的指针vptr。虚继承的情况下,子类会增加某种形式的指针,或者指向虚基类的子对象,或者指向相关的表格,表中窜犯虚基类子类的对象地址,或者偏移量,此指针成为bptr。我下面这个图不知道我理解的对不对?
【 在 saka123 的大作中提到: 】
: #include "iostream"
: using namespace std;
: class A{
: ...................
我觉得B的实例中应该包含B的虚基类指针+B的虚函数表指针+A的虚函数表指针 所以是4+4+4=12。还有就是我发现如果把B中的f2改成f1,结果就是8了,是不是因为发生了覆盖所以就没有A的虚函数表指针了呢。
【 在 Elamp 的大作中提到: 】
: 我觉得B的实例中应该包含B的虚基类指针+B的虚函数表指针+A的虚函数表指针 所以是4+4+4=12。还有就是我发现如果把B中的f2改成f1,结果就是8了,是不是因为发生了覆盖所以就没有A的虚函数表指针了呢。
应该是,如果只是覆盖的话 B 对象里有一个 vptr 就够了,否则还要再加一个 vptr
我也是这么想的,可是这样B的大小应该是8才对啊。。可编程序验证是12。。。
【 在 SparksFly 的大作中提到: 】
: 我也是刚看虚继承,回答不正确欢迎指正:
: 每个类产生指向虚函数的指针,放到虚函数表中(表中存放指向各个虚函数的指针)。每个类有一个直线虚函数表的指针vptr。虚继承的情况下,子类会增加某种形式的指针,或者指向虚基类的子对象,或者指向相关的表格,表中窜犯虚基类子类的对象地址,或者偏移量,此指针成为bptr。我下面这个图不知道我理解的对不对?
: [upload=1][/upload]
好像是的。。谢谢指教。。。
【 在 Elamp 的大作中提到: 】
: 我觉得B的实例中应该包含B的虚基类指针+B的虚函数表指针+A的虚函数表指针 所以是4+4+4=12。还有就是我发现如果把B中的f2改成f1,结果就是8了,是不是因为发生了覆盖所以就没有A的虚函数表指针了呢。
我这运行结果都是 4,符合书本的描述
【 在 saka123 的大作中提到: 】
: #include "iostream"
: using namespace std;
: class A{
: ...................
【 在 saka123 的大作中提到: 】
: #include "iostream"
: using namespace std;
: class A{
: ...................
运行了一下,结果都是4.
g++下面后两个打印是8和8。没有用c++11。
【 在 hyfeng121 的大作中提到: 】
: 我这运行结果都是 4,符合书本的描述
: [upload=1][/upload]