•
noneffective
n.
无效;无战斗力
adj.
无效的;无战斗力的
1、
Noneffective
Transit Depot ─── 无效果的运输站
2、
noneffective
storage ─── 无效果的存储
3、
noneffective
verbs ─── 无效动词
1、ineffective ─── adj.无效的,失效的;不起作用的
2、nonexecutive ─── adj.非执行的
3、nonreflective ─── 无反射
4、effective ─── adj.有效的,起作用的;实际的,实在的;给人深刻印象
5、nonelective ─── 不合正常情理的;未经选举产生的
6、noneffectives ─── n.无效;无战斗力;adj.无效的;无战斗力的
7、non-reflective ─── 无反射
8、noninfective ─── 非感染性
9、nondirective ─── adj.不定向的;无方向性的;非指示性的
虚析构函数与非虚析构函数哪里不一样?
把你的问题整理一下如下:
这个时候我delete 执行父类的指针又会发生什么呢?
C++中明确指出,当派生类对象经由一个基类指针被删除,而此基类仅提供了non-virtual析构函数,其结果是未定义的。如果删除基类指针,则需要运行基类构造函数并清除基类的成员,如果对象实际是指向派生类类型的对象,则没有定义这种行为。
实际执行是通常发生的是对象的derived成分没有被销毁(不同的编译器实现可能不同),而派生类中的base class成分通常会被销毁,这就造成了一个“局部销毁”的对象,从而造成资源泄露。
在Meyers的《Effective C++》《More Effective C++》中都提到过virtual析构函数,消除这个问题很简答:给base class一个virtual析构函数,这会保证运行适当的析构函数。
Now,现在就有这样一个问题,是不是要把所有的class的析构函数都要带上virtual呢,这同样是错误的。要实现virtual函数,对象必须携带某些信息,主要用来在运行时决定哪一个virtual函数应该被调用。这份信息通常是由一个所谓vptr(virtual table pointer)指针指出。vptr指向一个由函数指针构成的数组,成为vtbl(virtual table);每一个带有virtual函数的class都有一个相应的vtbl。当对象调用一个virtual函数,实际被调用的函数取决于该对象的vptr所指的那个vtbl,编译器在其中寻找适当的函数指针。当然在Scott Meyers的另一本书《More Effective C++》中有详细的介绍,同时尝试实现虚函数机制。virtual函数的实现细节并不重要,重要的是如果class中含有virtual函数,其对象的体积会增加,这会带来许多麻烦问题。