虚函数有什么缺点或者析构函数声明为虚函数有什么缺点?
大体原因如下:如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,对象增加一个虚指针,使得对象的体积增大。
所以基本的一条是:无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。
class Point{
public:
Point(int xCoord, int yCoord){//省略...}
~Point(){}
private:
int x,y;
}
虚函数的实现细节是不重要的。重要的是如果Point类包含一个虚函数,这个类型的对象的大小就会增加。在一个 32 位架构中,它们将从 64 位(相当于两个 int)长到 96 位(两个 int 加上 vptr);在一个 64 位架构中,他们可能从 64 位长到 128 位,因为在这样的架构中指针的大小是 64 位的。为 Point 加上 vptr 将会使它的大小增长 50-100%!Point 对象不再能塞入一个64bit缓存器。而且,Point 对象在 C++ 和其他语言(比如 C)中,看起来不再具有相同的结构,因为其它语言缺乏 vptr 的对应物。因此也就不再可能传入其它语言写成的函数或从其中传出,除非你为 vptr 做出明确的补偿。
STL里的容器都没有虚析构函数,全部的 STL 容器类型(例如,vector,list,set,tr1::unordered_map)