dynamic_cast操作符

来源:互联网 发布:sqlserver日期格式转换 编辑:程序博客网 时间:2024/05/16 02:09

1.dynamic_cast操作失败:

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

特别是可以对值为0的指针应用dynamic_cast,这样做的结果是0.

// 动态类型转换#include <iostream>using namespace std;class A {public:virtual ~A (void) {}};class B : public A {};class C : public B {};class D {};int main (void) {B b;A* pa = &b;cout << "pa = " << pa << endl;cout << "---- dynamic_cast ----" << endl;// pa实际指向B对象,转换成功B* pb = dynamic_cast<B*> (pa);cout << "pb = " << pb << endl;// pa没有指向C对象,转换失败C* pc = dynamic_cast<C*> (pa);cout << "pc = " << pc << endl;// pa没有指向D对象,转换失败D* pd = dynamic_cast<D*> (pa);cout << "pd = " << pd << endl;cout << "---- static_cast ----" << endl;// B是A的子类,转换成功pb = static_cast<B*> (pa);cout << "pb = " << pb << endl;// C是A的孙类,转换成功,危险!pc = static_cast<C*> (pa);cout << "pc = " << pc << endl;// D非A的子类,转换失败,安全!//pd = static_cast<D*> (pa);//cout << "pd = " << pd << endl;cout << "---- reinterpret_cast ----" << endl;// 编译期、运行期均不检查类型,永远成功,非常危险!pb = reinterpret_cast<B*> (pa);cout << "pb = " << pb << endl;pc = reinterpret_cast<C*> (pa);cout << "pc = " << pc << endl;pd = reinterpret_cast<D*> (pa);cout << "pd = " << pd << endl;return 0;}

2.使用dynamic_cast和引用

dynamic_cast<Type&> (val)

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

因为不存在空引用,所以不可能对引用使用用于指针强制类型转换的检查策略,相反,当转换失败的时候,它抛出一个std::bad_cast异常,该异常在库头文件typeinfo中定义

如:

void f(const Base& b){try {const Derived& d = dynamic_cast<const Derived&> (b);} catch (bad_cast){//...}}

3.使用typeid操作符

只有当typedi的操作数是带虚函数的类类型的对象的时候,才返回动态类型信息。测试指针(相对于指针指向的对象)返回指针的静态的、编译时类型。

如:

#include <iostream>#include <typeinfo>#include <cstring>using namespace std;class A {public:virtual ~A (void) {}};class B : public A {};void foo (A* pa) {//if (! strcmp (typeid (*pa).name (), "1A"))if (typeid (*pa) == typeid (A))cout << "A对象" << endl;else//if (! strcmp (typeid (*pa).name (), "1B"))if (typeid (*pa) == typeid (B))cout << "B对象" << endl;}int main (void) {cout << typeid (int).name () << endl;cout << typeid (double*).name () << endl;cout << typeid (char (*)[10]).name () << endl;cout << typeid (char* [10]).name () << endl;cout << typeid (char* (*) (int, short)).name () << endl;cout << typeid (A).name () << endl;A* pa = new B;cout << typeid (pa).name () << endl;cout << typeid (*pa).name () << endl;foo (pa);foo (new A);return 0;}
volatile限定符

可以声明volatile指针、指向volatile对象的指针,以及指向volatile对象的volatile指针。(同const用法相似)

对链接到C的预处理器支持

#ifdef __cplusplusextern "C"#endifint strcmp(const char*, const char*);



原创粉丝点击