若使用基类指针delete派生类对象,需将基类和派生类的析构函数声明为virtual

    技术2022-05-11  69

        在多态的设计中,如果准备使用基类指针delete派生类对象,需将基类和派生类的析构函数声明为virtual,否则程序将无法按预期工作。

    几种写法产生的运行结果如下:1、基类和派生类析构任一个为virtual,另一个非virtual,程序行为未定义,一般会产生运行时错误。2、基类和派生类析构都为非virtual,只有基类的析构被调用,派生类的析构不会被调用,一般会引起内存泄露。3、基类和派生类析构都为virtual,程序正常工作,派生类和基类的析构函数先后被调用。

    #include  < iostream > using   namespace  std; class  CA {public:    CA()    {        cout << "CA()" << endl;    }    virtual ~CA()    {//OK        cout << "~CA()" << endl;    }    /* ~CA()    {//ERROR    cout << "~CA()" << endl;    }    */} ; class  CB :  public  CA {public:    CB()    {        cout << "CB()" << endl;    }    virtual ~CB()    {//OK        cout << "~CB()" << endl;    }    /* ~CB()    {//ERROR    cout << "~CB()" << endl;    }    */} ; int  _tmain( int  argc, _TCHAR *  argv[]) {    CA *pa = new CB();    delete pa;    return 0;}  

    最新回复(0)