- 如果基类的析构是non-virtual的,在使用base class指针指向一个derived对象,并且这个对象由base class指针删除时,derived对象的成分并没有被删除,原因是base class定义了一个non virtual析构(因此无法动态绑定)。所以目前看解决方法就是把这个base class定义一个virtual析构。
- (不太理解,需要一些virtual pointer和virtual table和不同语言之间传递对象的知识)一个关于可移植性方面的考量。定义虚函数的class含有一个virtual pointer和一个virtual table,该virtual pointer占用运行时计算机体系结构的指令宽度,在32位系统中,vptr占32bit。
- 只有class内含有至少一个virtual函数,才把析构声明为virtual。(因为通过动态绑定可能在运行时调用derived的函数,因此需要调用dervied的析构)
- 只要写代码的时候需要多态性质(base绑定到derived),且base的析构是non-virtual,就会产生问题。使用一个base指针指向derived对象,在释放这个base指针时,derived的对象资源仍然泄漏。(所以在C++11之后,应该把这个场景中的base class定义为final,以防止此场景出现)
- 希望定义一个抽象base,但是不知道该把哪个函数定义为纯虚?就把析构定义为纯虚。(注意:base的这个纯虚的析构要给一个空的函数体,因为只有这样,derived的析构在调用base的析构时,linker不会给出warning)
- 第5条是用于具有多态性质的base class,而对于STL中的容器例如string,不是为了多态用途的。