2011-12-29 52 views
-1

我正在学习C++。在内存图中需要帮助

我想有一个很好的内存视图,就像下面的代码运行时引擎盖下的内容一样。

// dynamic_cast 
    #include <iostream> 
    #include <exception> 
    using namespace std; 

    class CBase { virtual void dummy() {} }; 
    class CDerived: public CBase { int a; }; 

    int main() { 
    try { 
    CBase * pba = new CDerived; 
    CBase * pbb = new CBase; 
    CDerived * pd; 

    pd = dynamic_cast<CDerived*>(pba); 
    if (pd==0) cout << "Null pointer on first type-cast" << endl; 

    pd = dynamic_cast<CDerived*>(pbb); 
    if (pd==0) cout << "Null pointer on second type-cast" << endl; 

    } catch (exception& e) {cout << "Exception: " << e.what();} 
    system("PAUSE"); 
    return 0; 
    } 

任何人都可以请帮我..?

+1

哪一部分是不确定的? – John 2011-12-29 15:53:04

+1

我不确定这样的图表会是什么样子。你能提供一个例子吗? – cdhowie 2011-12-29 15:54:14

+0

好吧,如果你可以画出前4行..没关系我 – user882196 2011-12-29 15:54:25

回答

0

pd = dynamic_cast<CDerived*>(pba);后,情况是这样的:

pba ---> [CDerived] 
     ^
pd -------' 

pbb ---> [CBase] 

即,pbapd指向同一个对象。但是,它们的输入方式不同。

pd = dynamic_cast<CDerived*>(pbb);后,pd0(空),因为投无效:

pba ---> [CDerived] 

pd ----> (null) 

pbb ---> [CBase] 
1

我不太清楚你真正的问题是什么,但我假设它是如何的dynamic_cast <> ()的作品。从实际的角度来看,它在内部如何实施并不重要,特别是对于不同的系统而言,实施方式不同。有Stanley Lippman的书(“C++对象模型内部”),这本书现在有点过时,但仍然很好地描述了这些细节以形成一幅心理图像。需要注意的重要一点是,使用dynamic_cast <>()不仅仅是查看具有不同类型的对象并可能进行一些较小的调整,但可能涉及在类似于继承树的内部表示中搜索内容。

这就是说,将dynamic_cast(PBA)大致是这样的:

  1. 获取一个指向内部类型信息(通常称为“虚函数指针表”或“VTBL”虽然当代实现别使用vanilla虚拟函数指针表)来标识类型。为了这个工作,dyanmic_cast的参数的静态类型(在本例中为“CBase”)需要至少有一个虚函数。
  2. 此对象中的类型信息可能与目标类型(例如您的示例中的情况)一致,在这种情况下系统会对指针(在某些情况下需要涉及多重继承的情况下需要进行必要的调整)和返回相应的指针。否则,即如果目标类型可以是对象的动态类型的基类,则系统尝试在动态类型的基类中找到目标类型。在单一继承的情况下,这相当简单,但如果涉及多重继承,则可能涉及很多搜索。

也就是说,使用dynamic_cast <>()会频繁地将性能问题引入到您的程序中。但是,在需要的地方不使用它会造成程序崩溃的可能性。一般来说,使用dynamic_cast <>()的需求相对较少。如果你发现自己使用dynamic_cast <>(),你的设计几乎肯定是有缺陷的。