2012-03-09 45 views
1

StackOverflow。我的第一篇文章。
我從C++和MFC中得到了D,這是我在工作中使用的 - 不僅是GUI的東西,還有許多MFC的宏(DECLARE_DYNCREATE等)和CObject類。
我怎麼看,在D我們有std.Object類與factory方法。D的MFC的CRuntimeClass替換

那麼,如何正確在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

向下轉換在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'?例如像'void DoSmth(A a)'這樣的函數。 'typeof'使用關於類型的編譯時信息,所以它總是顯示'A'。並感謝您的回答。 – Raxillan 2012-03-09 13:49:07

+0

1)是2)[typeid](http://dlang.org/expression.html#TypeidExpression)。 – 2012-03-09 16:00:23

+0

啊哈。所以,再次感謝你的D項目,祝你好運 - 他們令人印象深刻。最後一個問題:D已經有了編譯時的反思。但是運行時怎麼樣,比如Qt QMetaObject的東西? – Raxillan 2012-03-09 16:27:28

相關問題