派生クラスのデストラクタにもvirtualが必要な時はどういう時か?


C++でポリモーフィズムを使用する際、基底クラスのデストラクタをvirtualにする必要があるということはよく言われることですが、派生クラスのデストラクタもvirtualとして宣言しておくべきかどうか悩んでいます。

派生クラスのデストラクタも仮想関数でなければならない時というのはどういう時でしょうか。逆に仮想関数じゃなくても良い(vtableへのコストからしないほうがよい場合)時というのはどういう時か、という事も併記して頂けるととても助かります。




基底クラスのデストラクタをvirtualにすると自動的にその派生クラスのデストラクタもvirtualになります。  
デストラクタに限らず基底クラスでvirtualと宣言した関数は派生クラスでvirtualと宣言しようとしまいとvirtualとして扱われます。

本家SOの似た質問のリンクを貼っておきます。  
[Are virtual destructors
inherited?](https://stackoverflow.com/questions/2198379/are-virtual-
destructors-inherited)

**追記**  
一応仕様書を抜粋しておきます。

ISO/IEC 14882:1998(E)より

> 10.3 Virtual functions  
>  2 If a virtual member function vf is declared in a class Base and in a
> class Derived, derived directly or indirectly  
>  from Base, a member function vf with the same name and same parameter  
>  list as Base::vf is declared, then Derived::vf is also virtual  
>  (whether or not it is so declared) and it overrides Base::vf.
>
> 12.4 Destructors  
>  7 A destructor can be declared virtual (10.3) or pure virtual (10.4); if
> any objects of that class or any derived class are  
>  created in the program, the destructor shall be defined. If a class  
>  has a base class with a virtual destructor, its destructor (whether  
>  user- or implicitly- declared) is virtual.




基底クラスのデストラクタをvirtualにすると自動的にその派生クラスのデストラクタもvirtualになります。  
デストラクタに限らず基底クラスでvirtualと宣言した関数は派生クラスでvirtualと宣言しようとしまいとvirtualとして扱われます。

本家SOの似た質問のリンクを貼っておきます。  
[Are virtual destructors
inherited?](https://stackoverflow.com/questions/2198379/are-virtual-
destructors-inherited)

**追記**  
一応仕様書を抜粋しておきます。

ISO/IEC 14882:1998(E)より

> 10.3 Virtual functions  
>  2 If a virtual member function vf is declared in a class Base and in a
> class Derived, derived directly or indirectly  
>  from Base, a member function vf with the same name and same parameter  
>  list as Base::vf is declared, then Derived::vf is also virtual  
>  (whether or not it is so declared) and it overrides Base::vf.
>
> 12.4 Destructors  
>  7 A destructor can be declared virtual (10.3) or pure virtual (10.4); if
> any objects of that class or any derived class are  
>  created in the program, the destructor shall be defined. If a class  
>  has a base class with a virtual destructor, its destructor (whether  
>  user- or implicitly- declared) is virtual.

