__declspec(delphiclass)
カテゴリ
修飾子(C++)、拡張キーワード、記憶クラス指定子(C++)
構文
__declspec( delphiclass ) declarator
説明
delphiclass 引数は、Delphi 形式のクラスの宣言に使用します。 これらのクラスは以下の互換性を持つように作成されます。
- Object Pascal 互換の RTTI
- Delphi 互換の例外処理
- Delphi 互換のコンストラクタ/デストラクタの動作
- AfterConstruction および BeforeDestruction の手続き(通常の C++ クラスなら、それぞれコンストラクタおよびデストラクタに含められるはずのコード)
Delphi 形式のクラスには、以下の制限があります。
- 仮想基底クラスは使用できません。
- 「継承とインターフェイス」で説明した場合を除き、多重継承は使用できません。
- グローバル演算子 new を使って動的に割り当てる必要があります。
- コンストラクタやメソッドがまだ何も実行されないうちに状態を定義できるよう、Delphi 形式のインスタンスはゼロで初期化されます。 この機能がなければ、コンストラクタよりも先にメソッドが呼び出された場合に予期しない結果が生じかねません。
- Delphi 形式の派生クラスについては、コピー コンストラクタおよび代入演算子はコンパイラで自動生成されません。
- Delphi 形式のクラスであることをコンパイラが認識する必要がある場合は、Object Pascal から変換された前方クラス宣言に delphiclass 修飾子を付ける必要があります。 (たとえば、クラス宣言より前でクラス ID などの RTTI 情報が必要な場合。)
備考:
- 通常の C++ クラスとは異なり、Delphi 形式の基底クラスでは、コンストラクタやデストラクタで仮想メソッドを呼び出し、"できるだけ下位の派生クラス" の実装を実行することができます。 そのため、どのコンストラクタも実行されていない間にクラスのメソッドが実行される可能性があります。
例
次の例では、クラス名を返すクラス メソッドを持った Delphi 形式のクラスを宣言しています。
#include <System.hpp>
#include <stdio.h>
#include <tchar.h>
class __declspec(delphiclass) TLock : public TObject {
public:
virtual __classmethod UnicodeString GetClsName() {
return this->ClassName();
}
};
int _tmain(int argc, _TCHAR* argv[]) {
printf("%ls", TLock::GetClsName().c_str()); // displays TLock
return 0;
}