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就不会有这个问题了。

  • 相关阅读:
    java 上传图片
    getElementById 鼠标经过字体改变颜色
    getElementById 学习
    css的绝对定位与相对定位
    关于For循环
    扩展方法的应用
    关于Function 的学习笔记
    <a>标签中查找文件的方法
    关于Name ID class属性的区别
    使用float设置经典的网站前端结构
  • 原文地址:https://www.cnblogs.com/whyandinside/p/1638020.html
Copyright © 2011-2022 走看看