我正在一个应用程序中编写一个实用程序类,它们可能是也可能不是 future 的派生类。我没有任何虚函数(使用虚拟 dtor 的一般准则),因此考虑到我的内存限制,我选择在这个实用程序类中不使用虚拟析构函数。
一些程序员后来 - 有人通过从它派生来添加到我的实用程序类。现在,如果在代码的任何地方,我在 new'd 中的新类和删除的正确的 dtor 将不会被调用,因为基类 dtor 没有被虚拟化(参见示例代码)。
除了返回并更改基类之外 - 在这种情况下还有什么解决方案?
#include <iostream>
using namespace std;
class utility {
int i, j;
public:
utility () { cout << "utility ctor\n";};
~utility () { cout << "utility dtor\n";};
void dosomething () { cout << "haha\n";};
};
class addtoutility: public utility {
char *ch;
public:
addtoutility () { ch= new char(); cout << "added ctor\n";};
~addtoutility () { delete ch; cout << "added dtor\n";};
void andnowaddsomefunctionality () {};
};
int main () {
utility *u = new addtoutility();
//lots of interesthing code
delete u;
}
最佳答案
您的基类不是多态的,因此在任何情况下拥有指向基的指针都没有什么值(value)。您的基类通过不在任何地方使用 virtual
关键字来证明它不是多态的。
如果有人想将它用作多态层次结构的基类,那么他们可以将 virtual
析构函数添加到他们从中派生的第一个类,并在必要时保存指向该基类的指针类型。
你不能阻止后来的程序员自己挖陷阱,但非多态类并没有错,你不需要对它做任何事情来“让它安全”。
作为证明这是普遍且可接受的做法的证据,您只需看一下标准库。有许多类(严格地说,它们中的大多数是类模板)没有虚函数,也没有虚析构函数。
关于C++ 和虚拟析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262669/