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

  • 相关阅读:
    Oracle SQL语句大全(一)
    数据查询(3)-复杂查询(芮)
    数据查询(2)-高级查询(芮)
    数据查询(1)-简单查询(芮)
    T-SQL(5)-操作数据行(芮)
    T-SQL(4)-功能函数(芮)
    T-SQL(3)-批处理(芮)
    T-SQL(2)-逻辑控制(芮)
    T-SQL(1)-变量(芮)
    如何设计数据库(2)?(芮)
  • 原文地址:https://www.cnblogs.com/whyandinside/p/1638020.html
Copyright © 2011-2022 走看看