关于c++中运行时类型识别的问题

kodobeast 2006-12-10 11:42:42
我写这段的代码的目的是,我想建立个链表。存储所有的对象的指针,我想把他们都转化成动物基类的指针,用的时候在转换回来。
class animal
{
public:
animal(void);
~animal(void);
void virtual fly();
};
animal::animal(void)
{

}

animal::~animal(void)
{
}
void animal::fly()
{
}

class bird :public animal
{
public:
bird();
~bird();
void fly();

};

class dog: public animal
{
public:
dog();
~dog();
void brak();
};


bird::bird()
{}
bird::~bird()
{}
void bird::fly()
{
std::cout<<"fly"<<std::endl;
}

dog::dog()
{}
dog::~dog()
{}
void dog::brak()
{}
// testRTTI.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include ".\animal.h"
#include "test.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

bird birdObject;
dog dogObject;
animal* pointBird=&birdObject;
animal* pointDog=&dogObject;
if(typeid(*pointBird)==typeid(bird))
cout<<" find bird"<<endl;
else
cout<<"connot change "<<endl;
bird* pointB=dynamic_cast<bird*>(pointBird);
//如果这的fly不是虚函数行吗?
pointB->fly();
return 0;
}

这种运行时的转换为什么不能执行阿,c++支持吗?如果可以的话,怎么改这段代码
...全文
548 19 打赏 收藏 举报
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cunsh 2006-12-11
  • 打赏
  • 举报
回复
我写这段的代码的目的是,我想建立个链表。存储所有的对象的指针,我想把他们都转化成动物基类的指针,用的时候在转换回来。
======================
楼主看下boost的any和shared_ptr
cunsh 2006-12-11
  • 打赏
  • 举报
回复
在vc要先打开RTTI.
还有这里fly是不是虚函数都行.但用dynamic_cast你这个animal类必须有个虚函数才行.
axx1611 2006-12-11
  • 打赏
  • 举报
回复
怎么不能执行?
以上代码在gcc上无问题。

估计楼主用VC6而没开RTTI吧。。。。
taodm 2006-12-11
  • 打赏
  • 举报
回复
呃,要上visitor模式或者double dispathc模式了。看设计模式,或者more effective c++ item 31
kodobeast 2006-12-11
  • 打赏
  • 举报
回复
如果使用多态的话,那我在dog里面加的非虚函数。就没办法用链表里面存的基类指针调用了。
kodobeast 2006-12-11
  • 打赏
  • 举报
回复
dogObject传进去我用它的引用形式
kodobeast 2006-12-11
  • 打赏
  • 举报
回复
请问redleaves(程序员)
只要定义一个虚函数,通过这个函数可以得到对象本身的指针,这个怎么实现啊。比如
dog dogObject;
那么怎么在这个dog类里面实现获得这个dogObject的指针的函数啊,
dogObject.getPoint(dogObject)
{
dog* point=&dogObject;
}
这么写行吗?
mathe 2006-12-11
  • 打赏
  • 举报
回复
我觉得比较好的方法是自己给dog实现一个fly函数来报错就可以了。
void dog::fly(){
ERROR("I am a dog and I could not fly\n");
}
axx1611 2006-12-11
  • 打赏
  • 举报
回复
RTTI在VC8中并不一定是默认关闭的~~ CLR工程就是默认打开的
redleaves 2006-12-11
  • 打赏
  • 举报
回复
其实不用RTTI也可以,楼主只要定义一个虚函数,通过这个函数可以得到对象本身的指针.用的时候调用一下就可以了.如果想测试类型,可以加上类似COM的接口查询机制.这种方法貌似比用RTTI快一点,也直接一点(其实RTTI也是类似的方式,只是再复杂点).
kodobeast 2006-12-11
  • 打赏
  • 举报
回复
如果用多态的话,那是不是我的狗和鸟中的方法名字是一样的啊!比如在基类定义10个虚函数,子类通过继承只能重写这些函数内容了。我用基类的指针只能得到这些虚的函数。还有我的子类函数不是虚的怎么办。就像我的狗类里面自己在定义的方法,用基类的指针不是取不出来了。我就没办法实现我要的类型转换。
ivenher 2006-12-11
  • 打赏
  • 举报
回复
http://www.cppblog.com/ivenher/articles/12264.html
jixingzhong 2006-12-11
  • 打赏
  • 举报
回复
在基类中定义一些 基本的空 虚函数,
然后在 相应的 派生类中 重写函数就可以了 ~~

对象传递使用基类类型的指针进行传递,
访问方式使用指针访问成员函数,
得到的就是实际类型的方法 ...
jixingzhong 2006-12-11
  • 打赏
  • 举报
回复
我写这段的代码的目的是,我想建立个链表。存储所有的对象的指针,我想把他们都转化成动物基类的指针,用的时候在转换回来。
=================
使用 多态,
完美的解决 !!
北极猩猩 2006-12-11
  • 打赏
  • 举报
回复
RTTI在VC中是默认关闭的(不只是VC6),可以在编译设置中打开。

另外,RTTI一定要在类中有虚函数时才起作用,不过楼主的程序是没用问题的。

不过在C++中不鼓励使用动态类型判断,慎之慎之。
ivenher 2006-12-11
  • 打赏
  • 举报
回复
MFC的类型动态识别可以看看,不错
rongcanf 2006-12-11
  • 打赏
  • 举报
回复
用virtual就搞定了啊
superxiaomm 2006-12-11
  • 打赏
  • 举报
回复
我来谈谈我的看法,这是本人理解,见笑了。如有错误,请立即指正。所谓RTTI,指的是runtime类型识别,主要有两个特别的函数,iskindof,createobject.所以要实现RTTI还需要像mfc里面那样构建类型识别网络,由宏来做到。楼主的只是多态而以,要实现多态,就要用virtual,来构建虚拟指针表。
还有,dynamic_cast<>是不是提倡使用?应为这个转型有花销,他会一个一个比较你是不是父类的子类。如果就用普通转型,应该会快,但是少了类型的判断。lz自己看着办拉。
OOPhaisky 2006-12-11
  • 打赏
  • 举报
回复
只有你的类中至少有一个virtual成员函数时,RTTI才会真正起作用(即,在运行时刻给出类型的实际信息),如果类型没有任何virtual函数,则RTTI是编译时期的事情,此时会根据静态声明来给出相关信息,这是也就算不上真正的RTTI了。
还有,vc系列编译器需要打开相应功能才可以有RTTI的。
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2006-12-10 11:42
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下