2012-03-09 32 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