大龙的博客

常用链接

统计

最新评论

VC下用dynamic_cast的问题

#include "iostream.h"
class base
{
int i;
public:
base(int I = 0):i(I) {}
virtual int value() const {return i;}
};
class derived:public base
{
public:
derived(int I = 0):base(I) {}
int value() const {return base::value()*2;}
virtual int shift(int x) const {return base::value()<< x;}
};
void main()
{
base* B[] = {new base(7),new derived(8)};
cout << "B[0]->value:"<<B[0]->value()<<endl;
cout << "B[1]->value:"<<B[1]->value()<<endl;
derived* cp = dynamic_cast<derived*>(B[1]);
if(cp)
{
cp->shift(2);
}
//cout << "B[1]->value:"<<((derived*)B[1])->shift(2)<<endl;
}

原意是想使用dynamic_cast,看B[1]是否为derived*,然后调用derived才有的shift(),但程序编译无错,运行时发生错误,请问具体是什么原因.可否详细讲解一下dynamic_cast的用法.谢谢


回复人: expert(技术专家)   信誉:100
测一下,由于没有return值,线程的退出代码即传递给ExitThread或者TerminateThread值未知,所以编译器把exitcode当作有返回的main来取,就是类似int main()有一个堆栈来保护返回值那样, 把那个返回值取出来。所以exitcode总有不同。比如你仅仅是HANDLE hThread = ::GetCurrentThread();这时候的exitcode就是hThread的值。这应该是编译器行为。


回复人: expert(技术专家)   信誉:100
晕。。。。'dynamic_cast' 当然要加/GR
楼主不会是这个错误吧。。。。狂晕。。。
自做多情了半天,还以为是exitcode有什么关系。

以上仅仅是臆测~

 

点评:

当静态型别与动态型别不一治时,由于虚拟函数时动态鉴定的,所以,当静态是基类,而动态是派生类时,他会自动执行派生类的函数.但是,对于,在派生类中新增加的函数,不会自动转换,这个时候就会用到static_cast 或者是 dynamic_cast 转换了,

感觉是这样,呵呵
dynamic_cast是向下的转化,就是A指针可以是否转化为B类指针;
它有什么用呢?
当我们必须使用派生类的特性,而该特性又没有出现在基类中时,我们常常要用到:

posted on 2006-12-03 16:54 大龙 阅读(591) 评论(1)  编辑 收藏 引用

评论

# re: VC下用dynamic_cast的问题 2011-04-29 17:02 hello


try
{
derived* cp = dynamic_cast<derived*>(B[1]);
}catch(bad_cast& bc)
{
}  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理