在内存图中需要帮助
问题描述:
我正在学习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;
}
任何人都可以请帮我..?
答
pd = dynamic_cast<CDerived*>(pba);
后,情况是这样的:
pba ---> [CDerived]
^
pd -------'
pbb ---> [CBase]
即,pba
和pd
指向同一个对象。但是,它们的输入方式不同。
pd = dynamic_cast<CDerived*>(pbb);
后,pd
将0
(空),因为投无效:
pba ---> [CDerived]
pd ----> (null)
pbb ---> [CBase]
答
我不太清楚你真正的问题是什么,但我假设它是如何的dynamic_cast <> ()的作品。从实际的角度来看,它在内部如何实施并不重要,特别是对于不同的系统而言,实施方式不同。有Stanley Lippman的书(“C++对象模型内部”),这本书现在有点过时,但仍然很好地描述了这些细节以形成一幅心理图像。需要注意的重要一点是,使用dynamic_cast <>()不仅仅是查看具有不同类型的对象并可能进行一些较小的调整,但可能涉及在类似于继承树的内部表示中搜索内容。
这就是说,将dynamic_cast(PBA)大致是这样的:
- 获取一个指向内部类型信息(通常称为“虚函数指针表”或“VTBL”虽然当代实现别使用vanilla虚拟函数指针表)来标识类型。为了这个工作,dyanmic_cast的参数的静态类型(在本例中为“CBase”)需要至少有一个虚函数。
- 此对象中的类型信息可能与目标类型(例如您的示例中的情况)一致,在这种情况下系统会对指针(在某些情况下需要涉及多重继承的情况下需要进行必要的调整)和返回相应的指针。否则,即如果目标类型可以是对象的动态类型的基类,则系统尝试在动态类型的基类中找到目标类型。在单一继承的情况下,这相当简单,但如果涉及多重继承,则可能涉及很多搜索。
也就是说,使用dynamic_cast <>()会频繁地将性能问题引入到您的程序中。但是,在需要的地方不使用它会造成程序崩溃的可能性。一般来说,使用dynamic_cast <>()的需求相对较少。如果你发现自己使用dynamic_cast <>(),你的设计几乎肯定是有缺陷的。
哪一部分是不确定的? – John 2011-12-29 15:53:04
我不确定这样的图表会是什么样子。你能提供一个例子吗? – cdhowie 2011-12-29 15:54:14
好吧,如果你可以画出前4行..没关系我 – user882196 2011-12-29 15:54:25