2012-03-09 9 views
1

StackOverflow。私の最初の投稿はこちら。
私は私が私の仕事で使っていた、C++とMFCからDに来ている - GUIのものだけでなく、しかし(などDECLARE_DYNCREATE、)多くのMFCのマクロとCObjectクラス。
私はどのようにDを見たのstd.Objectクラスfactoryメソッドを持っています。MFCのCRuntimeClassの置換D

だから、正しく、 DのこのC++コードを書き換えますか?それが可能ならば、もちろんです。

class CPerson : public CObject 
{ 
    DECLARE_DYNAMIC(CPerson) 
    // other declarations 
}; 
IMPLEMENT_DYNAMIC(CPerson, CObject) 
void DoSmthWithObject(const CObject* pObj) 
{ 
    CPerson* pPerson = dynamic_cast<CPerson*>(pObj); 
    ASSERT_VALID(pPerson); 
    // Work with out CPerson object. 
} 

// Somethere in code create our CObject... 
CObject* pMyObject = new CPerson; 

// .. and do some strange things with it. 
DoSmthWithObject(pMyObject); 

答えて

2

ダウンキャストはすでに無効なダウンキャストがnull参照になります実行しようとすると、Dにランタイムチェックされます。

class A { } 
class B : A { } 
class C { } 

unittest 
{ 
    A a = new A(); 
    Object o = a;    // upcasts are implicit 
    assert(o !is null);   // OK, all classes implicitly descend from Object 
    assert(cast(A)o !is null); // OK, same class 
    assert(cast(B)o is null); // Not allowed, B is subclass of A 
    assert(cast(B)a is null); // Ditto 
    assert(cast(C)o is null); // Not allowed, C is unrelated to A 
    assert(cast(C)a is null); // Ditto 
    assert(cast(C)cast(void*)a !is null); // Use intermediate cast to 
              // void* to bypass runtime checks 
} 
+0

Offtop:あなたはaeライブラリの著者ですか?興味深いプロジェクト、私はいくつかのコードをチェックします。 subjについて:実行時に_real_型の 'a'を決定する方法は?例えば、 'DoSmth(A a)'のような関数のようなものです。 'typeof'は型に関するコンパイル時の情報を使うので、常に' A'を表示します。そして答えに感謝します。 – Raxillan

+0

1)はい2)[typeid](http://dlang.org/expression.html#TypeidExpression) –

+0

Aha。だから、あなたのDプロジェクトにもう一度感謝します。そして最後の質問:Dはすでにコンパイル時の反映を持っています。しかし、Qt QMetaObjectのようなランタイム1はどうですか? – Raxillan

関連する問題