- 如果基类的析构是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的析构)
- 即使处理不含virtual函数的base class时,也可能会出现问题。比如base class的析构是non-virtual的,使用一个base指针指向derived对象,在释放这个base指针时,derived的对象资源仍然泄漏。(所以在C++11之后,应该把这个场景中的base class定义为final,以防止此场景出现)