Fork me on GitHub

2/18/2011

Base Class 應該要有 virtual destructor

base class 沒有把 destructor 宣告為 virtual,當 derived class 透過 base class 指標被刪除的時候,呼叫的並不是 derived class 的 destructor,而是只呼叫了 base class 的 destructor。

#include <iostream>
using namespace std;

class Base{
public:
  ~Base() {
    cout << "base destructor" << endl;
  }
};

class Derived: public Base {
public:
  ~Derived() {
    cout << "derived constructor" << endl;
  }
};

int main(int argc, const char* argv[]) {

  {
    Derived d;
  }

  cout << "=========" << endl;

  Base *b = new Derived;
  delete b;

  return 0;

}

執行結果為:

derived constructor
base destructor
=========
base destructor



#include <iostream>
using namespace std;

class Base{
public:
    virtual ~Base() { // 這裡加上 virtual
    cout << "base destructor" << endl;
  }
};

class Derived: public Base {
public:
  ~Derived() {
    cout << "derived constructor" << endl;
  }
};

int main(int argc, const char* argv[]) {

  {
    Derived d;
  }

  cout << "=========" << endl;

  Base *b = new Derived;
  delete b;

  return 0;

}

執行結果為:

derived constructor
base destructor
=========
derived constructor
base destructor


...

No comments:

Post a Comment