Java和C#支持使用final
和sealed
关键字定义不能作为基类的类。然而,在C++中,没有很好的方法防止一个类被派生出来,这让类的作者面临两难境地:是否每个类都应该有一个虚析构函数?
编辑:自C++11起,这不再是真实的,您可以指定一个类为final
。
一方面,给一个对象添加虚析构函数意味着它将拥有一个vtable,因此每个对象会额外消耗4个(在64位机器上为8个)字节用于vptr。
另一方面,如果稍后有人从这个类派生并通过指向基类的指针删除派生类,则程序将是未定义的(由于缺少虚析构函数),而且为了每个对象优化指针是荒谬的。
然而,重要的是拥有虚析构函数(可以说)表明该类型旨在以多态方式使用。
有些人认为你需要明确的理由才能不使用虚析构函数(正如这个问题的潜台词所示),而其他人则说只有在有理由相信你的类将被派生时才应该使用它们,你认为呢?