C++中确定基类有虚析构函数(二)

2014-11-24 13:11:00 · 作者: · 浏览: 10
向namedarray类型的指针转换成了array类型的指针,然后用delete来删除array指针,那你就会立即掉进“不确定行为”的陷阱中。

namedarray *pna =
new namedarray(10, 20, "impending doom");

array *pa;

...


pa = pna; // namedarray* -> array*

...

delete pa; // 不确定! 实际中,pa->arrayname
// 会造成泄漏,因为*pa的namedarray
// 永远不会被删除


现实中,这种情形出现得比你想象的要频繁。让一个现有的类做些什么事,然后从它派生一个类做和它相同的事,再加上一些特殊的功能,这在现实中不是不常见。namedarray没有重定义array的任何行为――它继承了array的所有功能而没有进行任何修改――它只是增加了一些额外的功能。但非虚析构函数的问题依然存在(还有其他问题,参见m33)

最后,值得指出的是,在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类――不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。

这里是一个例子:

class awov { // awov = "abstract w/o
// virtuals"
public:
virtual ~awov() = 0; // 声明一个纯虚析构函数

};