あなたの質問に対する回答から、純粋な仮想デストラクタを実際に使用する正当な理由を推測できませんでした。たとえば、次の理由はまったく納得できません。
おそらく、純粋な仮想デストラクタが許可されている本当の理由は、それらを禁止すると、言語に別のルールを追加することを意味し、純粋な仮想デストラクタを許可しても悪影響が発生しないため、このルールは必要ないからです。
私の意見では、純粋な仮想デストラクタは便利です。たとえば、コードに myClassA と myClassB の 2 つのクラスがあり、myClassB が myClassA を継承しているとします。Scott Meyers が著書「より効果的な C++」の項目 33「非リーフ クラスを抽象化する」で言及した理由により、myClassA と myClassB の継承元となる抽象クラス myAbstractClass を実際に作成することをお勧めします。これにより、抽象化が向上し、オブジェクトのコピーなどで発生する問題が回避されます。
(クラス myAbstractClass を作成する) 抽象化プロセスでは、myClassA または myClassB のメソッドが、純粋な仮想メソッドになるための適切な候補ではない可能性があります (これは、myAbstractClass が抽象化されるための前提条件です)。この場合、抽象クラスのデストラクタ純粋仮想を定義します。
以下は、私が自分で書いたコードの具体的な例です。共通のプロパティを共有する Numerics/PhysicsParams という 2 つのクラスがあります。したがって、抽象クラス IParams から継承させます。この場合、純粋に仮想的な方法を手元にまったく持っていませんでした。たとえば、setParameter メソッドは、すべてのサブクラスに対して同じ本体を持つ必要があります。私が持っていた唯一の選択肢は、IParams のデストラクタを純粋な仮想にすることでした。
struct IParams
{
IParams(const ModelConfiguration& aModelConf);
virtual ~IParams() = 0;
void setParameter(const N_Configuration::Parameter& aParam);
std::map<std::string, std::string> m_Parameters;
};
struct NumericsParams : IParams
{
NumericsParams(const ModelConfiguration& aNumericsConf);
virtual ~NumericsParams();
double dt() const;
double ti() const;
double tf() const;
};
struct PhysicsParams : IParams
{
PhysicsParams(const N_Configuration::ModelConfiguration& aPhysicsConf);
virtual ~PhysicsParams();
double g() const;
double rho_i() const;
double rho_w() const;
};