【发布时间】:2014-07-11 18:45:36
【问题描述】:
我知道这听起来可能是一个奇怪的问题,但我只是想知道 C++ 中的类是否比具有相同数据字段的结构更重要,而这件事我找不到答案... 考虑一下:
struct SomeStruct {
int a;
int b;
};
class SomeClass {
public:
SomeClass():a(0),b(0){}
private:
int a;
int b;
};
int main() {
std::cout<<sizeof(SomeStruct)<<std::endl; // output is 8
std::cout<<sizeof(SomeClass)<<std::endl; // output is 8
}
但是现在看看当我向 SomeClass 添加一个析构函数时会发生什么:
struct SomeStruct {
int a;
int b;
};
class SomeClass {
public:
SomeClass():a(0),b(0){}
virtual ~SomeClass(){}
private:
int a;
int b;
};
int main() {
std::cout<<sizeof(SomeStruct)<<std::endl; // output is 8 bytes
std::cout<<sizeof(SomeClass)<<std::endl; // output is 16 bytes!
}
为什么 SomeClass 的析构函数需要多 8 个字节?
【问题讨论】:
-
您添加了一个需要指向虚拟表 (vtable) 的指针的虚拟函数。
-
已经给出了正确的答案,但我想补充一点,你不必要地使析构函数虚拟化的事实看起来像是某些程序员显然认为的“所有析构函数必须是虚拟的”准则的应用程序10-20 年前是个好主意。这是一个非常糟糕的主意。
-
@Christian - 你能详细说明一下吗?为什么这是一个真的坏主意?
-
@ChristianHackl,Eclipse 自动为我生成了虚拟...
-
在不需要析构函数的地方创建一个虚拟的析构函数可能很容易使对象的大小翻倍,并且它给程序员一个错误的印象,即该类是要派生的。它会造成混乱并破坏价值类和具有标识的类之间在设计方面的重要区别。这只是一个非常无用的指南,它试图解决经验丰富的程序员不存在的问题,并且只是初学者课程设计中实际问题的症状。
标签: c++ destructor