C++ 在多态性增加派生类大小的情况下,在边派生类中为析构函数编写代码。为什么? #包括 结构Base1 { 公众: 虚拟void show()=0; }; 结构Base2 { 公众: 虚空显示()=0; }; 派生类:虚拟公共基1、虚拟公共基2 { 公众: 虚拟void show(){} 虚拟空显示(){} }; void main() { 使用名称空间std; 不能
1)基类没有虚拟析构函数。C++ 在多态性增加派生类大小的情况下,在边派生类中为析构函数编写代码。为什么? #包括 结构Base1 { 公众: 虚拟void show()=0; }; 结构Base2 { 公众: 虚空显示()=0; }; 派生类:虚拟公共基1、虚拟公共基2 { 公众: 虚拟void show(){} 虚拟空显示(){} }; void main() { 使用名称空间std; 不能,c++,visual-studio,C++,Visual Studio,1)基类没有虚拟析构函数。 2) 主返回int,而不是void 您需要的是实现定义。使用g++4.3.0,我在这两种情况下得到了相同的大小(在32位PC上8字节应该是一个好结果) 编辑 在implementation defined下,我的意思是它取决于虚拟继承的实现方式。通常,派生类包含指向基类的指针,但这种情况下没有必要 对于g++,为了能够获得每个子对象(指向基类的指针)的地址,派生类的大小应该是12字节(在32位机器上),但由于所有类都是空的(即没有成员变量),编译器可以自由地优化空基类
2) 主返回int,而不是void 您需要的是实现定义。使用g++4.3.0,我在这两种情况下得到了相同的大小(在32位PC上8字节应该是一个好结果) 编辑 在implementation defined下,我的意思是它取决于虚拟继承的实现方式。通常,派生类包含指向基类的指针,但这种情况下没有必要
对于g++,为了能够获得每个子对象(指向基类的指针)的地址,派生类的大小应该是12字节(在32位机器上),但由于所有类都是空的(即没有成员变量),编译器可以自由地优化空基类的大小,并将大小减少到8字节(不是4个字节,因为它需要能够提供两个基类的不同地址)。好吧,看看生成的代码,第一个示例具有以下内存布局:
#include <iostream>
struct Base1
{
public:
virtual void show()=0;
};
struct Base2
{
public:
virtual void Display()=0;
};
class Derived:virtual public Base1,virtual public Base2
{
public:
virtual void show(){}
virtual void Display(){}
~Derived(){}
};
void main()
{
using namespace std;
cout<<sizeof(Derived);
}
第二个有这样的布局:
| Derived::vtable | Base1::vtable | Base2::vtable |
我不知道零是什么。它们不是填充,因为填充未被cccc
初始化。在删除虚拟子对象和添加析构函数时,它们可能用作计数器或标志。这些字段被添加到类中。我未能使它们与00000000
不同
无论如何,你可以在你的问题中加上这个:为什么当我将析构函数设置为虚拟时,布局就变成了虚拟的
| Derived::vtable | 00 00 00 00 | Base1::vtable | 00 00 00 00 |
| Base2::vtable |
(24字节)?不重要,但它是在哪个编译器上复制的?@sharptooth:-每当我运行程序时,它都会显示相同的结果。我正在使用visual vc++9.0。如果它是实现定义的,它应该在gcc手册的某个地方记录下来。你能把它取出来吗?我添加了virtual~Base1()和virtual~Base2()在各自的类中,但结果是相同的,即当~Dervied()时当我插入时不出现12,然后显示20。我正在使用visual vc++9。0@Chubsdad在gcc手册中查找时遇到问题,但编辑部分解释了如何在g++中实现继承。vc9的实现应该类似,否?@VJo:-你能用VC++编译器解释一下吗。分别考虑这两种情况。@Suri否,因为我对windows和VC++编译器知之甚少。
| Derived::vtable | 00 00 00 00 | Base1::vtable | 00 00 00 00 |
| Base2::vtable |
| Derived::vtable | 00 00 00 00 | Base1::vtable | 00 00 00 00 |
| Base2::vtable | padding |