• C++的四种强制类型转换和一个有趣的例子


    又是程序员面试宝典,又是被虐的死去活来。这次是dynamic_cast。得,查资料加总结吧

    C++有四种强制类型转换,分别是 static_cast, dynamic_cast, reinterpret_cast, const_cast ,这四种转换网上一大堆讲解

    比如 Jerry19880126http://www.cnblogs.com/jerry19880126/archive/2012/08/14/2638192.html

    bamb00http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html

    很多的资料对于reinterpret_cast都是抱着一种慎用的态度,它的特性决定了它确实不安全。但是我在写串口通信和TCP/UDP通信的上位机时,曾经多次使用过这个转换。

    以串口通信为例,发送的数据类型为unsigned char(其实就是16进制数据),用一个unsigned char*指向它,但是串口发送的时候,Qt对串口的读写没有unsigned char类型的,发送时只能将数据转化成char*。于是就用到了reinterpret_cast。接收同理。

    unsigned char *pdesber;

    myCom->write(reinterpret_cast<char *>(pdesber+index),SendLength );


    再来谈一谈基类与派生类指针的问题。

    class Base{...};
    class Derived:public Base{...};
    int main()
    {
        Base *p = new Derived;
      return 0; }

    那么这个p到底是指向了父类对象还是子类对象呢?这个指针到底又能做些什么呢?

    感谢codexia大神的讲解,还提供了一个非常有趣的例子。

    例子1:我爸的朋友(和我爸是一辈的人)找我有事。为什么找我不找其他人呢,是因为和我爸有血缘关系。问题来了,那个朋友到底是找谁呢?

    例子2:虽然我是90后,可是我和我爸生活在一起,所以继承了父亲很多特性。这个朋友来找我问一些事,他不是90后,自然不会问一些我们这辈的事,只能问我一些他们那一辈的事(从父亲继承),看我做的怎样。问题来了,这个朋友到底问的是与什么有关呢?

    例子1说的是指针的指向问题,朋友当然是来找我的,所以指针是指向子类的(虽然那个朋友是和父亲一辈)。例子2说明的是指针的操作问题,朋友是老一辈的,他不懂90后所以不可能问与90后有关的生活,只能问老一辈的问题,所以指针只能操作从父类继承下来的东西(虽然他是指向子类的)。

    所以我认为

    Base *p = new Derived;

    Derived *q = dynamic_cast<Derived *>(p);

    完成的是子类到子类的转换,而不是父类到父类的转换。


    说一说自己目前的知识水平对dynamic_cast的理解。我的理解是这个转换用于检测类型转换是否是安全的。

    参考这篇博客,和我的理解差不多,讲的更详细,感谢作者零一小筑http://jetyi.blog.51cto.com/1460128/671256

  • 相关阅读:
    JavaScript事件阶段
    JavaScript阻止事件冒泡
    JavaScript事件冒泡
    JavaScript简单的随机点名系统
    理解Android线程创建流程
    SurfaceFlinger启动篇
    Android系统启动-zygote篇
    Android系统启动-Init篇
    Android系统启动-SystemServer下篇
    Android系统启动-SystemServer上篇
  • 原文地址:https://www.cnblogs.com/jiasaidongqi/p/4435591.html
Copyright © 2020-2023  润新知