VC语言

本类阅读TOP10

·VC++ 学习笔记(二)
·用Visual C++打造IE浏览器(1)
·每个开发人员现在应该下载的十种必备工具
·教你用VC6做QQ对对碰外挂程序
·Netmsg 局域网聊天程序
·Windows消息大全
·VC++下使用ADO编写数据库程序
·VC++学习笔记(四)
·非法探取密码的原理及其防范
·怎样在VC++中访问、修改注册表

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
thinking in c++卷2

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

Typeid操作符

获得对象运行时信息的另一种方法是使用typeid 操作符。这个操作符返回type_info类对象,

type_info产生应用类对象的信息。如果类型是多态的,他就给出关于大多衍生类型(动态类型)应用的信息;否则他就产生静态类型信息。Typeid操作符使用方法之一是得到一个被当作const char*对象的动态类型名字,正如你在下面的例子中所看到的:

//: C08:TypeInfo.cpp

// Illustrates the typeid operator.

#include <iostream>

#include <typeinfo>

using namespace std;

 

struct PolyBase { virtual ~PolyBase() {} };

struct PolyDer : PolyBase { PolyDer() {} };

struct NonPolyBase {};

struct NonPolyDer : NonPolyBase { NonPolyDer(int) {} };

 

int main() {

  // Test polymorphic Types

  const PolyDer pd;

  const PolyBase* ppb = &pd;

  cout << typeid(ppb).name() << endl;

  cout << typeid(*ppb).name() << endl;

  cout << boolalpha << (typeid(*ppb) == typeid(pd))

       << endl;

  cout << (typeid(PolyDer) == typeid(const PolyDer))

       << endl;

  // Test non-polymorphic Types

  const NonPolyDer npd(1);

  const NonPolyBase* nppb = &npd;

  cout << typeid(nppb).name() << endl;

  cout << typeid(*nppb).name() << endl;

  cout << (typeid(*nppb) == typeid(npd)) << endl;

  // Test a built-in type

  int i;

  cout << typeid(i).name() << endl;

} ///:~

使用一种特定编译器上面例子的输出是

struct PolyBase const *

struct PolyDer

true

true

struct NonPolyBase const *

struct NonPolyBase

false

int

输出的第一行正好反映了ppb的静态类型因为它是一个指针。为了得到RTTITo get RTTI to kick in),你需要注意指针或引用的目的对象,它是在第二行阐述的。注意RTTI忽略顶层的const volatile限定符。由于不是多态类型(With non-polymorphic types),你只能得到静态类型(指针本身的类型)。正如你所看到的,也支持内建类型。

他表明你不能在一个type_info对象里存放typeid操作符的结果,因为这里没有可访问的构造函数以及不接受赋值。你必须象我们展示的那样用它。另外,由type_info::name( )返回的实际字符串对编译器是有依赖的。例如,对一个较C的类,一些编译器返回class C而不是正好是C。对一个解除参照的null指针表达式应用typeid会引发一个bad_typeid 异常被抛出。

下面的例子表明type_info::name( )返回的类名字是被完全限定的

//: C08:RTTIandNesting.cpp

#include <iostream>

#include <typeinfo>

using namespace std;

 

class One {

  class Nested {};

  Nested* n;

public:

  One() : n(new Nested) {}

  ~One() { delete n; }

  Nested* nested() { return n; }

};

 

int main() {

  One o;

  cout << typeid(*o.nested()).name() << endl;

} ///:~

因为Nestedone类的一个成员的类型,结果就是One::Nested

你也可以用before(type_info&),查询一个type_info对象如果在实际定义的整理序列里它在另一个type_info对象之前。它返回truefalse。如果你说:

if(typeid(me).before(typeid(you))) // ...

你是在问在现在的整理序列里me是否在you之前发生。如果你把type_info对象作为关键字使用这是有用的。




相关文章

相关软件