zoukankan      html  css  js  c++  java
  • C++ 中dynamic_cast的使用方法

    /*这是从网上摘下的例子,主要讲述了 dynamic_cast<> 的使用方法。*/
    /*
    作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理,
           即会作一定的判断。
           对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;
           对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。
     
    注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数。例如在下面的代码中将CBasic类中的test函数不定义成
           virtual时,编译器会报错:error C2683: dynamic_cast : “CBasic”不是多态类型
     
    对编译器的要求:
           dynamic_cast<> 会用到RTTI技术,因此需要启动“运行时类型信息”这一选项,而在VC.net 2003中默认是关闭的。
           所以需要人为的启动这一选项。否则编译器会报下面的警告:
     
             warning C4541: “dynamic_cast”用在了带 /GR- 的多态类型“CBasic”上;
           可能导致不可预知的行为从而导致程序在运行时发生异常。
    该设置在 Project->Setting中 C/C++ -> C++ Language中设置。
    */
     
    #include <iostream>
    using namespace std;
     
    class CBasic
    {
    public:
         virtual int test(){return 0;} // 一定要是 virtual
    };
     
    class CDerived : public CBasic
    {
    public:
         virtual int test(){    return 1;}
    };
     
    int main()
    {
         CBasic        cBasic;
         CDerived    cDerived;
         
         CBasic * pB1 = new CBasic;
         CBasic * pB2 = new CDerived;
     
         //dynamic cast failed, so pD1 is null.
         CDerived * pD1 = dynamic_cast<CDerived * > (pB1);   
                     
         //dynamic cast succeeded, so pD2 points to  CDerived object                                        
         CDerived * pD2 = dynamic_cast<CDerived * > (pB2);   
         
         //dynamci cast failed, so throw an exception.            
    //    CDerived & rD1 = dynamic_cast<CDerived &> (*pB1);   
     
    //dynamic cast succeeded, so rD2 references to CDerived object.
         CDerived & rD2 = dynamic_cast<CDerived &> (*pB2);   
     
         return 0;
    }

    转自论坛的文章,地址http://bbs.byr.cn/#!article/SoftDesign/14689,使用中发现红字部分以前没注意过

  • 相关阅读:
    PHP保留小数的相关方法
    ASP.NET Core MVC 之过滤器(Filter)
    ASP.NET Core MVC 之控制器(Controller)
    ASP.NET Core MVC 之视图组件(View Component)
    ASP.NET Core MVC 之局部视图(Partial Views)
    标签助手(TagHelper)
    ASP.NET Core MVC 之布局(Layout)
    ASP.NET Core MVC 之视图(Views)
    ASP.NET Core MVC 之模型(Model)
    九卷读书:淘宝从小到大的发展 -重读《淘宝技术这十年》
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106895.html
Copyright © 2011-2022 走看看