• 关于继承中的强制类型转换


    dynamic_cast是与继承相关的类型转换关键字
    dynamic_cast要求相关的类中必须有虚函数
    用于直接或者间接继承关系的指针(引用)之间
    -指针:
      转换成功:得到目标类型的指针
      转换失败:得到一个空指针

    -引用:
      转换成功:得到目标类型的引用
      转换失败:得到一个异常操作信息

    编译器会检查dynamic_cast的使用是否正确
    类型转换的结果只可能在运行阶段才能得到

    #include <iostream>
    #include <string>
    
    
    using namespace std;
    
    
    class Base
    {
    public:
        Base()
        {
            cout << "Base::Base()" << endl;
        }
        ~Base()
        {
            cout << "Base::~Base()" << endl;
        }
    };
    
    
    class Derived : public Base
    {
    
    
    };
    
    
    int main()
    {
        Base* p = new Derived;
    
    
        Derived* pd = p;
    
    
        if( pd != NULL )
        {
            cout << "pd = " << pd << endl;
        }
        else
        {
            cout << "Cast error!" << endl;
        }
    
    
        delete p;
    
    
        return 0;
    }
    
    
    
    

     进一步改进:使用dynamic_cast关键字

    int main()
    {
        Base* p = new Derived;
    
        Derived* pd = dynamic_cast<Derived*>(p);
    
        if( pd != NULL )
        {
            cout << "pd = " << pd << endl;
        }
        else
        {
            cout << "Cast error!" << endl;
        }
    
        delete p;
    
        return 0;
    }

     为什么使用了dynamic_cast关键字后,编译还会出错?再看一下上边的规则,是因为类中没有虚函数。这个地方我们还需要去定义一个虚函数吗?完全没有必要,根据工程经验,但凡一个类被定义为父类,虚构函数就定义为虚函数。

    class Base
    {
    public:
        Base()
        {
            cout << "Base::Base()" << endl;
        }
    
        virtual ~Base()
        {
            cout << "Base::~Base()" << endl;
        }
    };

     假设此时p就指向一个父类对象,即

    int main()
    {
        Base* p = new Base;
    
        Derived* pd = dynamic_cast<Derived*>(p);  //不能使用一个子类指针指向一个父类对象
    
        if( pd != NULL )
        {
            cout << "pd = " << pd << endl;
        }
        else
        {
            cout << "Cast error!" << endl;
        }
    
        delete p;
    
        return 0;
    }

    小结:

    new/delete会触发构造函数或者析构函数的调用
    构造函数不能成为虚函数
    析构函数可以成为虚函数(可以避免内存泄露,还有一个好处使用dynamic_cast)
    构造函数和析构函数中都无法产生多态行为
    dynamic_cast是与继承相关的专用转换关键字

  • 相关阅读:
    python视频教程大全(转载)
    数据挖掘十大经典算法(转载)
    等值线算法(转载)
    主成分分析PCA(转载)
    K-Means 算法(转载)
    面试常见问题小结
    二叉树的深度和宽度
    二叉树最大路径和-Binary Tree Maximum Path Sum
    C++中单例模式
    OC对象的动态和静态构造区别
  • 原文地址:https://www.cnblogs.com/-glb/p/11973663.html
Copyright © 2020-2023  润新知