zoukankan      html  css  js  c++  java
  • C++类型转换:static_cast和dynamic_cast

    如果我们想在displayGeometricObject函数中显示更多的信息(详见C++泛型程序设计和多态)。假如是圆,那么显示其半径;假如是一个矩形,则显示其长和宽。

    在这里,由于要进行类型转换,所以函数签名改为displayGeometricObject(GeometricObject& g)。

    由于我们传入的参数是一个GeometricObject类的对象,所以它并不能直接显示半径或长和宽,我们需要对g进行类型转换。首先尝试静态类型转换static_cast

    #include <iostream>
    #include "GeometricObject.h"
    #include "Circle.h"
    #include "Rectangle.h"
    
    using namespace std;
    
    void displayGeometricObject(GeometricObject& g) {
        //在控制台打印对象g的描述信息
        cout << g.toString() << endl;
        cout << "半径为:" << static_cast<Circle*>(&g)->getRadius() << endl;
    
        cout << "长为:" << static_cast<Rectangle*>(&g)->getHeight() << endl;
        cout << "宽为:" << static_cast<Rectangle*>(&g)->getWidth() << endl;
    }
    int main()
    {
        Circle c;
        Rectangle r;
    
        displayGeometricObject(c);
        displayGeometricObject(r);
        return 0;
    }

    很明显静态类型转换存在错误,因为我们无法判断输入的是圆还是矩形,我们甚至可以把圆强行转换为矩形,那么就会出现错误:

    (其实使用静态转换也可以通过判断g.toString返回的字符串而选择转换的方式,但是更加推荐使用动态转换)

     因此我们要使用动态转换的方式dynamic_cast,在动态转换时,把Circle类转换为Rectangle类会转换失败,返回一个null(空值)

    #include <iostream>
    #include "GeometricObject.h"
    #include "Circle.h"
    #include "Rectangle.h"
    
    using namespace std;
    
    void displayGeometricObject(GeometricObject& g) {
        //在控制台打印对象g的描述信息
        cout << g.toString() << endl;
        Circle* p1 = dynamic_cast<Circle*>(&g);
        Rectangle* p2 = dynamic_cast<Rectangle*>(&g);
    
        if(p1 != NULL) {
            cout << "半径为:" << static_cast<Circle*>(&g)->getRadius() << endl;
        }
    
        if(p2 != NULL) {
            cout << "长为:" << static_cast<Rectangle*>(&g)->getHeight() << endl;
        cout << "宽为:" << static_cast<Rectangle*>(&g)->getWidth() << endl;
        }
    }
    int main()
    {
        Circle c;
        Rectangle r;
    
        displayGeometricObject(c);
        displayGeometricObject(r);
        return 0;
    }

    运行结果:

     这样一来就可以避免强行转换的错误。

  • 相关阅读:
    第一讲 jQuery入门
    Log4j日志记录
    第四讲 Hibernate 缓存管理
    第一讲 Hibernate 简介
    第三讲 Spring 持久层封装、事务控制
    对 PInvoke 函数的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标
    善用 C# 3.0 Extensions 方法
    .net 下如何将文档文件(Word, Pdf等) 中的文本提取出来(转)
    vs2010常用快捷键 (转)
    Silverlight 视频学习札记(一)
  • 原文地址:https://www.cnblogs.com/bwjblogs/p/12801983.html
Copyright © 2011-2022 走看看