读书人

这样的类型转换为什么会崩溃?该如何处

发布时间: 2012-04-17 15:06:33 作者: rapoo

这样的类型转换为什么会崩溃?
class A1
{
public:
A1()
{

}
virtual void print()
{

}
};

class A2:public A1
{
public:
A2()
{

}
};

class A3:public A2
{
public:
void print()
{
A1::print();
}
};

int _tmain(int argc, char *argv[])
{
A1* p1 = new A3;
A3* p2 = dynamic_cast<A3*>(p1);//这里就崩溃了 而用static_cast就不会崩溃 为啥????
return 0;
}

[解决办法]
lz用的啥编译器?
VS2008 无错
[解决办法]
VS2008无错。
[解决办法]
RTTI在VS2008中默认为关闭,可以通过修改编译选项Enable Run-Time Type Info 为 Yes,
来启用RTTI,只有当启动RTTI时,用来RTTI功能的typeid和dynamic_cast才能正常工作。
我有个设计 Render来渲染一些图形模型 需要知道运行时的图形具体类型 用到RTTI
Render直接设计到图形模型中又夹杂一起了 纠结啊
[解决办法]
V6下会崩溃,至于为什么,或许是V6对于dynamic_cast有更严格的限制吧,看楼下怎么答

[解决办法]

原来是没有打开 Enable Run-Time Type Info
[解决办法]
RTTI三言两语说不清楚,具体可以看下C++ Primer后两章的类容
static_cast的转换相当于一个强转,不保证类型安全性,关键在于后一句话
为什么不安全?如果你看过深度探索C++对象模型你就知道,这种转换其实是模型替换
基类指针转换为派生类
那就是用派生类的对象模型替换基类对象模型,这个替换是内存空间上的基类对象模型的一个延伸,也就是说基类对象的空间不足以容纳派生类的对象,所以他要延伸内存空间来彻底装下派生类的对象
那么这就出现了个问题,这延伸出来的空间是否可以访问?这是不安全因素的根本原因
派生类指针转换为基类
这个就是内存“切割”,派生类对象占的空间太大,基类对象要不了这么多就会“切去一部分”,当然这是安全的,你通过基类指针访问这块空间是安全的,因为本来这块空间就可以访问,只不过原来大一点,现在“切了一点”。
另外:A3* p2 = dynamic_cast<A3*>(p1);一般是这么用的if(NULL != p2)~~;一般会判断下,因为转换不成功p2是指向NULL的,这就避免了它潜在的危险性。
[解决办法]

探讨RTTI在VS2008中默认为关闭,可以通过修改编译选项Enable Run-Time Type Info 为 Yes

读书人网 >C++

热点推荐