读书人

dynamic_cast一个奇怪有关问题

发布时间: 2012-03-18 13:55:39 作者: rapoo

dynamic_cast一个奇怪问题
class Widget { };
class SpecialWidget: public Widget { };
void update(SpecialWidget *psw)
{
};
int main(int argc, char* argv[])
{
SpecialWidget sw;

Widget *pw = &sw;
update(dynamic_cast <SpecialWidget *> (pw));//编译通不过


return 1;
}
//不知道哪位好人知道这个原因否?

[解决办法]
因为你的类里没有虚函数,rtti不会起作用。
[解决办法]
不能将基类转换成派生类,除非你想强制转换~
[解决办法]
类里面一定要虚函数才能真正转换,不知道是为了找到他们共同点吗?
谢谢taodm
[解决办法]
如果好奇心很强,就去看《深度探索C++对象模型》
建议新手不要在这些细节上浪费太多时间,知道答案,按正确的方法做就可以了。
[解决办法]
class Widget
{
public:
virtual void go(void)
{
}
};
class SpecialWidget: public Widget
{
public:
virtual void go(void)
{
}
};
把上面类改成这样,编译是通过,但是运行就马上出错了,
这个是什么缘故呢?
[解决办法]
你的完整代码?
错在哪一行啊?
用调试器单步跟踪过没有?
[解决办法]
首先,你的class 继承结构中要有Virtual Function
其次 return 1;
dynamic_cast可以把base pointer to derived object convert derive pointer
[解决办法]
规定很合理啊,呵呵。
如果类中没有virtual函数,那么它就不该被继承所以也就不需要什么dynamic_cast了。呵呵。

从原理上说,RTTI所需要的类型信息是被放在类的vTable里面的,而没有virtual函数的类根本就没有vTable,所以也自然不能使用RTTI了。


另外,有一些C++编译器中RTTI默认是被关上的(我记得VC6就是这样),如果要使用的话,需要自己打开编译选项
[解决办法]
一个是指针,另一个不是
没有办法cast
[解决办法]
不是很懂哦,我用的是 vc6.0 编译器 ,难道是有一些C++编译器中RTTI默认是被关上的(我记得VC6就是这样),如果要使用的话,需要自己打开编译选项

读书人网 >C++

热点推荐