• Effective C++ 条款7 关于基类的virtual析构和nonvirtual析构


    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,不是为了多态用途的。
  • 相关阅读:
    Anaconda环境下安装库
    数据库定义、性质、演变
    web测试与app测试区别
    黑盒测试用例设计方法
    软件测试黑盒、灰盒、白盒测试的区别
    web端指什么?
    apache、tomcat和svn有什么作用,区别是什么
    H5如何测试?
    软件测试工具
    web与app测试重点
  • 原文地址:https://www.cnblogs.com/ijpq/p/16753596.html
Copyright © 2020-2023  润新知