C++Primer学习笔记:运行时类别识别

来源:互联网 发布:罗技g900 mac 编辑:程序博客网 时间:2024/05/12 07:18

dynamic_cast操作符:

dynamic_cast操作符的作用是将基类类型对象的引用的指针或指针转化为同一继承层次中其他类型的引用或指针。

1、与dynaminc_cast一起使用的指针必须是有效的——它必须为0或者指向一个对象

2、与其他强制类型转换不同,dynamic_cast涉及运行时类型检查。如果绑定到引用或指针的对象不是目标对象,则dynamic_cast失败。dynamic_cast操作符一次执行两个操作,它首先验证被请求的转换是否有效,只有转换有效,操作符才实际进行转换。

指针或引用所绑定的对象的类型在编译时是未知的,基类的指针可以赋值为指向派生类对象。同样,基类的引用也可以用派生类对象初始化,因此,dynamic_cast操作符执行的验证必须在运行时进行。

如果转换到指针类型的dynamic_cast失败,则dynamic_cast的结果是0值;如果转换到引用类型的dynamic_cast失败,则抛出一个bad_cast类型的异常。

例子1:

假定,Base是至少带一个虚函数的类,Derived类派生于Base类。basePtr为指向Base的指针,可以将它强制类型转换为指向Derived的指针

if (Derived *derivedPtr = dynamic_cast<Derived*> (basePtr))

{

//use the Derived object to which DerivedPtr points

}

else

 {

//basePtr points at a Base object

}

例子2:

使用dynamic_cast将基类的引用转化为派生类引用

dynamic_cast<Type &> (val);

Type是转换的目标类型,而val是基类类型的对象。只有当val是实际引用一个Type类型的对象,或者val是一个Type派生类型的对象的时候,dynamic_cast操作才将操作数val转换为想要的Type&类型。

void f(cosnt Base &b)

{

try {

const Derived &d = dynamic_cast <xonst Derived&> (b);

//use teh Derived object to which b referred

}

catch(bad_cast) {

//handle the fact that the cast failed

}

}



typeid操作符:

typeid操作符是程序可以问一个表达式:你是什么类型?

typeid(e) 这里e是任意表达式或者类型名

1、typeid操作符可以与任何类型的表达式一起使用。包括内置类型的表达式以及常量都可以用作typeid操作符的操作数;还包括类类型。如果typeid的操作数不是类类型或者没有虚函数的类,则typeid操作符指出操作数的静态类型;如果操作数是定义了至少一个虚函数的类类型,则在运行时计算类型。

2、typeid操作符的机构是名为type_info的标准库类型的对象的引用。使用typeid操作符必须使用type_info头文件

3、typeid最常见的用途是比较两个表达式的类型,或者将表达式的类型与特定类型相比较。


type_info类:

1、 type_info类打算做基类使用,type_info类也提供公用虚析构函数

2、默认构造函数和复制构造函数以及赋值操作符都被定义为private,所以不能定义或复制type_info类型的对象。程序中创建type_info对象的唯一方法是使用typeid操作符。

type_info类提供的操作:

t1 == t2     如果两个对象t1和t2的类型相同,就返回true,否则返回false

t1 != t2 如果两个对象t1和t2的类型相同,就返回true,否则返回false

t.name( ) 返回c风格的字符串

t1.before(t2) 返回指出t1是否出现在t2之前的bool值。


例子:

int iobj;

cout << typeid(iobj).name() << endl

<< typeid(8.16).name() << endl

<< typeid(std::string).name() << endl

<< typeid(Base).name() << endl

<< typeid(Derived).name() << end;

程序产生下面的输出:

int
double
class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >

class Base

class Derived
请按任意键继续. . .

0 0
原创粉丝点击