ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ dynamic_cast

2022-04-17 23:35:37  阅读:167  来源: 互联网

标签:基类 dynamic C++ cast pa 派生类 指针


dynamic_cast应用于类的指针、类的引用或者 void*。 dynamic_cast运算符可以在执行期决定真正的类型。

  • 如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。
  • 如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。
  • dynamic_cast 主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

基类指针下转时,如果发现指向的不是一个发生在多态中的子类对象,则会返回 NULL指针以后判断使用。

#include <iostream> 
using namespace std; 
class A
{
public:
    virtual ~A(){} 
};

class B:public A{};
class C:public A{};

class D{};
//downcast   no-relation
int main(int argc, char *argv[]) 
{
    // if(typeid(*pa) == typeid(b)) 
    B b;
    A *pa = &b;
    B* pb = dynamic_cast<B*>(pa);
    
    if(pb != NULL)
        cout << "pb != NULL" << endl; 
    else
        cout << "pb == NULL" << endl;
    
    C *pc = dynamic_cast<C*>(pa); 
    if(pc != NULL)
        cout << "pc! = NULL" << endl; 
    else
        cout << "pc == NULL" << endl;
    
    D *pd = dynamic_cast<D*>(pa); 
    if(pd != NULL)
        cout << "pc! = NULL" << endl; 
    else
        cout << "pc == NULL" << endl; 
    return 0;
}

在什么情况下你应该使用dynamic_case替代虚函数?

如果我们需要在派生类中增加新的成员函数f,但又无法取得基类的源代码,因而无法在基类中增加相应的虚函数,这时,可以在派生类中增加非虚成员函数,但这样一来,就无法用基类指针调用函数f,如果在程序中需要通过基类指针(如使用该继承层次的某个类中所包含的指向基类对象的指针数据成员p)来调用f,则必须使用dynamic_cast将p转换为只想派生类的指针,才能调用f,也就是说,如果无法为基类增加虚函数,就可以使用dynamic_cast代替虚函数.

标签:基类,dynamic,C++,cast,pa,派生类,指针
来源: https://www.cnblogs.com/meng-chao/p/16157846.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有