1. 程式人生 > >只有基類的析構函數需要為虛函數

只有基類的析構函數需要為虛函數

可見 spa ive char dto code reserve pre div

//
//  main.cpp
//  TescDtor
//
//  Created by Jiacan Li on 6/16/17.
//  Copyright © 2017 Jiacan Li. All rights reserved.
//

#include <iostream>
using namespace std;

class ClxBase1
{
public:
    ClxBase1()
    {
    }
    
    virtual ~ClxBase1()
    {
        cout<<"~ClxBase1
"<<endl; } }; class ClxBase2 : public ClxBase1 { public: ClxBase2() { } ~ClxBase2() { cout<<"~ClxBase2"<<endl; } }; class ClxDerived : public ClxBase2 { public: ClxDerived() { } ~ClxDerived() { cout
<< "~ClxDerived" << endl; } }; int main(int argc, const char * argv[]) { ClxBase1* cp = new ClxDerived(); delete cp; int i = 0; }

將一個子類的對象賦值給父類指針,當刪除該指針時,如果沒有將基類的指針寫為虛函數,那麽只會調用基類的析構函數。

測試上面的代碼:

1、ClxBase1* cp = new ClxDerived(); 當刪除指針時,會打印三條Log;

2、ClxBase2* cp = new ClxDerived(); 當刪除指針時,會打印三條Log;

可見,只要在根類上生命虛析構函數,則刪除任意子類指針的時候,都會順序調用繼承樹路徑上的析構函數。

只有基類的析構函數需要為虛函數