C++では基底クラスにvirtualデストラクタを書こう


(/)

C++調
C++()virtual(TB)Effective C++


virtualvirtual
virtualvirtualdelete*1
#include<iostream>

using std::cout;
using std::endl;

class BadBase {
 public :
  BadBase(){}
  //FIXME virtualデストラクタがないよ!!
};
class BadSub : public BadBase{
 public :
  BadSub(){
   cout << "リソース確保しますた" << endl;
  }
  ~BadSub(){
   //何かリソースを開放する
   cout << "リソース開放しますた" << endl;
  }
};

int main(){
 BadSub* sub = new BadSub();  //"リソース確保しますた"
 delete sub;   //"リソース解放しますた"

 BadBase* base = new BadSub(); //"リソース確保しますた"
 delete base;   //リソースが開放されない!

 return 0;
}

codepad



virtual
#include<iostream>

using std::cout;
using std::endl;

class Base {
 public :
  Base(){}
  //例えすることがなくても、基底クラスにはvirtualデストラクタが必要
  virtual ~Base(){}
};
class Sub : public Base{
 public :
  Sub(){
   cout << "リソース確保しますた" << endl;
  }
  virtual ~Sub(){
   //何かリソースを開放する
   cout << "リソース開放しますた" << endl;
  }
};

int main(){
 Sub* sub = new Sub(); //"リソース確保しますた"
 delete sub;  //"リソース解放しますた"

 Base* base = new Sub(); //"リソース確保しますた"
 delete base;  //"リソース解放しますた"

 return 0;
}

codepad

C++virtualJavafinal
C++virtualvirtual

C++Effective C++C++C++Effective C++<追記>
TB
C++virtual 
Uncopyable
(Private)Private使Uncopyable





C++virtual

C++ new/delete  virtual (
id:wraith13
 

Uncopyable
vtbl
C++



C++C++使

 

C++使
vtbl




C++vtbl 
id:meg_nakagami
 

id:wraith13vtbl/


std::unary_functionC++functional
std::unary_functionstd::binary_functionvirtual
std::unary_function()unary_functionunary_function
使

virtual

*1:Effective C++C++