Effective C++ - 条款7 - 关于基类的virtual析构和non-virtual析构

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