Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300117
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2009-08-30 11:07:22

RTTI: Run-Time Type Identification ,运行时类型识别,程序通过基类型的指针或引用来确定它们所指向的到底是基类型对象还是派生类型对象。C++中提供了两种方法,(1)dynamic_cast运算符将基类型指针或引用转换为派生类型指针或引用。(2)typeid 运算符,返回所带参数所指对象的实际类型。
注:上两个运算符对至少拥有一个虚函数的类类型的对象适用,其它类型参数则返回静态类型(编译时的类型)

(1)dynamic_cast运算符
   当我们需要通过基类型指针或引用调用派生类中不属于基类的函数时,可以通过该运算符进行类型转换。虽然更常见的方法是定义虚函数,但有时不能使用虚函数(什么时候?)。使用dynamic_cast易出错,风险大。
使用方式为 dynamic_cast (base *);  dynamic_cast (base &);
对于指针,base * 必须有指向对象或值为NULL,转换失败则 返回NULL;
对于引用,转换失败,抛出 bad_cast 类型异常。
由于基类型指针或应用实际指向对象编译时不能确定,故dynamic_cast的参数检查和转换只发生在运行时。

class base {
public:
virtual void func(){};
};


class derived:public base{
};

int main()
{base obj;
 derived obj2;

 base *bp=&obj;
 derived *dp;
 if(dp=dynamic_cast<derived *>(bp))
 {
    cout<<"cast ok"<<endl;
 }
 else{
     cout<<"no cast"<<endl;

 }
 if(dp==NULL){cout<<"NULL"<<endl;}
}

程序运行结果,输出“no cast” “NULL”,没有发生类型转换。
将main中第三条语句改为“base *bp=&obj2”,则程序运行结果为“cast ok”。
如果将基类中虚函数注释掉,则编译程序在dynamic_cast处报错  cannot dynamic_cast `bp' (of type `class base*') to type `class derived*' (source type is not polymorphic)。
   对指针进行转换最好如此在if语句中进行,方便检查,将犯其它错误的可能性降低。
   对应用进行转换要放入try catch语句,因为失败会抛出异常。


(1)typeid运算符。最好导入头文件typeinfo(不知原因)
使用方式: typeid(参数),返回参数的类型。
使用时可以

if(typeid(参数1)==typeid(参数2))

或者

cout<<typeid(参数).name()

int 为i,float为f,基类为4base,派生类为7derived
阅读(565) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~