当前位置:编程学习 > C/C++ >>

C++虚继承问题

请解释分析一下以下代码的输出结果

class A {
private:
char k[3];
public:
virtual void f(){}
};
class B:virtual public A {
private:
char j[3];
public:
virtual void t(){}
};
class C:virtual public B {
private:
char i[3];
virtual void w(){}
};
void main() {
cout << sizeof(A) << sizeof(B) << sizeof(C);
}

答案:VC++中:在虚继承中,派生类需要一个指针表示自己这个实体在基类的偏移量。一般来继承情况是,派生类与父类的地址完全一样,但是在虚继承中父类与派生类地址缺不一样,所以每个派生的虚继承类会多出一个指针来表示与父类地址的偏移量,占四个字节。另外虚表:对于虚继承类来说,其里面的虚函数如果在其父类的续表中没有被找到,则会在这个类中再添加一张虚表。并且把里面的虚函数放到这个虚表中。

所以解释你的问题:

sizeof( A ) == 8,因为k[3]由于编译器字节对齐原因,占4个字节。由于里面有虚函数,所以建立一张虚表,占四个字节。

sizeof( B ) == 20 因为内嵌的A占8个字节,j[3]占4个直接,虚继承有个偏移量指针占 4字节,由于虚函数没有在父类的虚函数表中找到,所以新为这个类建立一个虚表,4个字节共20个字节。

注意,如果把B改成

class B:virtual public A {
private:
char j[3];
public:
virtual void f(){}
};

则sizeof( B ) == 16,原因很简单,因为函数f在其父类找到了。不必建立虚表(注意每类只有一个虚表)

同理不难得出sizeof( C ) == 32了,

你可以改改C:

class C:virtual public B {
private:
char i[3];
virtual void f(){}
};
看看sizeof( C ) == 28?

修改了一下运行了一下

#include <iostream>
using namespace std;
class A {
private:
char k[3];
public:
virtual void f(){}
};
class B:virtual public A {
private:
char j[3];
public:
virtual void t(){}
};
class C:virtual public B {
private:
char i[3];
virtual void w(){}
};
class D
{
public:
virtual void t(){}
};
void main() {
A a;
B b;
C c;
D d;
memset(&a,1,sizeof(a));
memset(&b,2,sizeof(b));
memset(&c,3,sizeof(c));
memset(&d,4,sizeof(d));
cout <<"a:"<< sizeof(a)<<"b:" << sizeof(b) <<"c:"<< sizeof(c) <<sizeof(d);
}

输出结果a:8b:20c:32

然后查看了一下内存

0x0012FF08 04 04 04 04 cc cc cc cc cc cc cc cc 03 03 03 03 03 .................
0x0012FF19 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 .................
0x0012FF2A 03 03 03 03 03 03 03 03 03 03 cc cc cc cc cc cc cc .................
0x0012FF3B cc 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 .................
0x0012FF4C 02 02 02 02 cc cc cc cc cc cc cc cc 01 01 01 01 01 .................
0x0012FF5D 01 01 01 cc cc cc cc 60 bf e1 f1 b8 ff 12 00 66 29 .......`.......f)

函数占4个字节,可以从D看出来

A中有3个CHAR一个函数,按照内存对齐,那3个char会补足4个字节在加上函数的4个字节就是8个字节

B中根据A的计算方式会算出8个字节来,因为继承了A所以在加上A的字节数,这时有16字节,另外4个字节我也不知道怎么来的,猜测的是因为继承的原因,不知道是继承的哪个关键字或者什么变量占用了这4个字节了。知道的请补充上。

C中根据A和B的计算,本身8字节,B20字节,还有一个继承的那未知的4字节,正好32字节。

那未知的4个字节谁能解释出来?

上一个:怎么学习C++语言.
下一个:请问有哪些软件可以调试C++程序

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,