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

  • 相关阅读:
    elk
    js时间处理
    idea首次提交项目
    kafka集群zookeeper集群详细配置
    单节点多节点等等详细解释
    kafka原理存储
    Thread-0" kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
    如何使用JMeter开源性能测试工具来构建Web性能测试体系
    自动化测试的理解
    VBS教程
  • 原文地址:https://www.cnblogs.com/whyandinside/p/1638020.html
Copyright © 2011-2022 走看看