C++的四种强制类型转换和一个有趣的例子
又是程序员面试宝典,又是被虐的死去活来。这次是dynamic_cast。得,查资料加总结吧
C++有四种强制类型转换,分别是 static_cast, dynamic_cast, reinterpret_cast, const_cast ,这四种转换网上一大堆讲解
比如 Jerry19880126的http://www.cnblogs.com/jerry19880126/archive/2012/08/14/2638192.html
和 bamb00的http://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