zoukankan      html  css  js  c++  java
  • C++ FAQ for me

    1. 为什么需要虚析构函数,什么时候需要?

    看下面的代码:

    虚析构函数
    class ClxBase
    {
    public:
        ClxBase() {};
        
    virtual ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;};

        
    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
    };

    class ClxDerived : public ClxBase
    {
    public:
        ClxDerived() {};
        
    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; 

        
    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
    };

    代码:

    ClxBase *pTest = new ClxDerived;
    pTest
    ->DoSomething();
    delete pTest;

    的输出结果是

    Do something in class ClxDerived!
    Output from the destructor of class ClxDerived!

    Output from the destructor of class ClxBase!
    如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:
    Do something in class ClxDerived!

    Output from the destructor of class ClxBase!

    为什么ClxDerived的析构函数没有调用呢? pTest的动态类型是ClxDerived,但是静态类型是ClxBase. 如果ClxBase的析构函数不加virtual,当调用 delete pTest时, 系统会只调用ClxBase的析构函数,而ClxDerived的析构函数不会被调用。

    当然了如果delete后面的指针的静态类型如果是ClxDerived就不会有这个问题了。

  • 相关阅读:
    让DIV实现抖动效果!
    Linux下如果python2和python3同时存在使用pip3
    Eclipse 查找一个接口的具体实现
    linux下编译安装软件到指定目录
    NG机器学习-octave基本操作
    NG机器学习
    全注解方式构建SpringMVC项目
    Java多线程学习开发笔记
    RabbitMQ 学习开发笔记
    Redis 学习开发笔记
  • 原文地址:https://www.cnblogs.com/whyandinside/p/1638020.html
Copyright © 2011-2022 走看看