Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在多态性增加派生类大小的情况下,在边派生类中为析构函数编写代码。为什么? #包括 结构Base1 { 公众: 虚拟void show()=0; }; 结构Base2 { 公众: 虚空显示()=0; }; 派生类:虚拟公共基1、虚拟公共基2 { 公众: 虚拟void show(){} 虚拟空显示(){} }; void main() { 使用名称空间std; 不能_C++_Visual Studio - Fatal编程技术网

C++ 在多态性增加派生类大小的情况下,在边派生类中为析构函数编写代码。为什么? #包括 结构Base1 { 公众: 虚拟void show()=0; }; 结构Base2 { 公众: 虚空显示()=0; }; 派生类:虚拟公共基1、虚拟公共基2 { 公众: 虚拟void show(){} 虚拟空显示(){} }; void main() { 使用名称空间std; 不能

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位机器上),但由于所有类都是空的(即没有成员变量),编译器可以自由地优化空基类

1)基类没有虚拟析构函数。
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     |