純粋仮想デストラクタ

http://www.geocities.jp/ky_webid/cpp/language/010.html

なんか色々組み合わせが凄いですね。

もはや何がしたいのか良く分からないですね。これ。

純粋仮想デストラクタを使うこと自体が稀ではありますが、どうしてもインターフェースクラスを作りたいが、純粋仮想関数に出来るメンバ関数が1つもないような場合に使います。

ということらしいです。なんだか無理やりですね。

ちなみに純粋仮想デストラクタは宣言時に定義もしないといけないらしいです。

#include <iostream>

class IClass {
public:
    virtual ~IClass() = 0;
};

class CClass : public IClass {
public:
};

int main () {
    CClass obj;
    return 0;
}
$ cl /W4 /EHs main.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj
main.obj : error LNK2019: 未解決の外部シンボル "public: virtual __thiscall IClas
s::~IClass(void)" (??1IClass@@UAE@XZ) が関数 "public: virtual __thiscall CClass:
:~CClass(void)" (??1CClass@@UAE@XZ) で参照されました。
main.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と、このように純粋仮想デストラクタを定義しなければなんかエラーが出まくります。

class IClass {
public:
    virtual ~IClass() = 0;
};

IClass::~IClass() {}

宣言だけでなく、上記のように定義もしておかなければなりません。