zoukankan      html  css  js  c++  java
  • Effective C++ 学习笔记(11)

    确定基类有虚析构函数


    class A
    {
    public:
    A()
    {
    cout
    <<"A constructor"<<endl;
    }
    ~A()
    {
    cout
    <<"A destructor"<<endl;
    }
    };

    class B: public A
    {
    public:
    B()
    {
    cout
    <<"B constructor"<<endl;
    }
    ~B()
    {
    cout
    <<"B destructor"<<endl;
    }

    };
    int main()
    {
    A
    * p =new B();
    delete p;
    return 0;
    }

      执行结果:

    对此解释:C++语言标准规定,当通过基类指针删除派生类的对象,而基类又没有虚析构函数,结果是不确定的。

    对此,将A的析构函数改为虚函数:

    class A
    {
    public:
    A()
    {
    cout
    <<"A constructor"<<endl;
    }
    virtual ~A()
    {
    cout
    <<"A destructor"<<endl;
    }
    };

      执行结果:

      结果正确。

    以上我们是在堆上分配的内存。

    改写main函数,在栈上分配:

    int main()
    {
    B b;

    return 0;
    }

      结果同上。分配在栈上的对象自动调用构造函数与析构函数。

  • 相关阅读:
    计算系数
    N皇后问题
    矩阵取数游戏
    过河卒
    经营与开发
    软件开发记录01
    搭建android开发环境
    软件工程结对作业01
    学习总结和教师评价
    站立会议14
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2126218.html
Copyright © 2011-2022 走看看