面试题 - reinterpret_cast

C++如何获取虚函数表(vtbl)的内容及虚成员函数指针存放原理 前言 因为不同的运行环境的运行结果是不同的,特别是不同的编译器对c++类对象模型的实现是很可能存在差异,所以有时不同的编译平台的代码不能兼容也是部分原因于此。本文的运行环境是: ubuntu16.04; 编译器g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609 一些关于指针的知识 这篇文章事引用于这篇博客内容其中的虚函数表(vtbl)的内容及函数指针存放顺序,这里针对这部分进行了进一步的分析,为了方便理解本篇文章的内容,对于没基础的人,有必要看下前面这 阅读详情

最近参加了一些面试,总是能遇见一些BT的题目,分享一下吧。

题目:class C多重继承于class A和Class B,如果想取消对B的继承,如何修改已有代码。条件是A和B不能修改。

我想,既然取消了继承,那用组合就行了。

然后,就是无理取闹的过程了,问用到了B的指针指向了C的对象,这时怎么办。

   1: B* pb = new C;

肯定是编译不过啦,让解决以后的编译问题,还提示用cast。

cast是那么好用的吗,比如下面的例子

   1: #include 
   2:  
   3: using namespace std;
   4:  
   5: class B{
   6: public:
   7:     void f()
   8:     {
   9:         cout << "B::f()" << endl;
  10:     }
  11: };
  12:  
  13: class C{
  14: public:
  15:     void g()
  16:     {
  17:         cout << "C::g()" << endl;
  18:     }
  19: };
  20:  
  21: int main()
  22: {
  23:     B *b = new B;
  24:     (reinterpret_cast(b))->g();
  25:  
  26:     system("pause");
  27:     return 0;
  28: }

如果两个类里面又有了virtual函数,就完全不是一回事了。

现在的结果是C::g(),而声名了virtual函数后,就会指向vptr,那样就会显示B::f()。

也许题目的目的是考察reinterpret_cast吧,那也够偏的了,还有考察mutable的,nnnd。

reinterpret_cast的使用 reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。 使用场景: 从指针类型到一个足够大的整数类型 从整数类型或者枚举类型到指针类型 从一个指向函数的指针到另一个不同类型的指向函数的指针 从一个指向对象的指针到另一个不同类型的指向对象的指针 从一个指向类函数成员的指针到另一个指向不同类型的函数成员... 阅读详情

相关推荐

面试、笔试题记录

强制类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分.隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 3)将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致...

weixin_30594001的博客 163

C++中四种类型转换符:static_cast、dynamic_castreinterpret_cast和const_cast要点解析

1.static_cast 可用于c++基本类型之间的转换,子类与派生类之间的指针转换,编译时检查转换有效性,不关联的类指针转换会在编译时报错,类不要求有虚函数。 typename dst_ptr = static_cast (src_ptr) 2.dynamic_cast 基类必须有虚函数,否则编译出错。c++在运行时不关系指针是什么类型的,关心的是指针指向的对象是什么类型的,简

phymat.nico的专栏 494

第一次面试(一) 关键词:reinterpret_cast 对象的内存印象 dynamic_cast

1、reinterpret_cast 不知道Adboe为什么总爱问reinterpret_cast这个很不安全的操作符的问题,既然人家问,就要搞清楚吧reinterpret_cast的不安全,在于它是进行比特位的拷贝,例int n=9;double d=reinterpret_cast (n);  //这里不能用编译会报错,似乎编译器认定结果就会出问题。原因将整形转化成do

filialpiety的专栏 837

【C++类型转换和IO流】

而使用dynamic_cast进行向下转型则是安全的,如果父类的指针(或引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针或引用指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针。上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针。用转换后的函数指针调用该函数时没有传入参数,因此这里打印出参数i的值是一个随机值。

2301_76560014的博客 988

C++的类型转换

1. C++中的4中类型转化分别是:_static_cast________、___reinterpret_cast______、__const_cast_______、___dynamic_cast______每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。因此C++提出了自己的类型转化风格,注意因为。1. typeid运算符。

sqm_C的博客 823

C++语言--类型转换

而使用dynamic_cast进行向下转型则是安全的,如果父类的指针(或引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针。上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针。dynamic_cast用于将父类的指针(或引用)转换成子类的指针(或引用)。

编程技术, 日益精进 290

C++进阶—C++的类型转换

在C语言中,如果。

Awkwardx的博客 551

C++的四种强制类型转换

目录 1、C语言中的类型转换 2、为什么C++需要四种类型转换 3、C++强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast 4、RTTI(了解) 5、常见面试题

bit_zyx的博客 1万+

C++——类型转换

static_cast用于相近类型之间的转换,编译器隐式执行的任何类型都可以用static_cast来转换,但是不能用于两个不相关的类型进行转换。①static_cast用于相关类型之间的转换,译器隐式执行的任何类型都可以用static_cast来转换,比如int和double的转换,相当于C的隐式类型转换。所以C++看中了C的转换缺陷,推出了属于自己的转换标准,但是要注意,C++是兼容C的,所以C++仍然可以使用C的转换方法。对象本身是无论如何都不允许转换的,所以转换的只是指向对象的指针或引用。

aaqq800520的博客 1228

C++-类型转换

转换类型主要应用场景基本类型转换、非多态类型转换、向上转型多态类型的安全向下转型const_cast移除或添加const/volatile属性低级别的不安全转换,如指针与整数互转C++的四种类型转换操作符提供了比C风格转换更安全、更明确的类型转换方式。理解每种转换的适用场景和限制条件,能够帮助开发者编写更安全、更易维护的代码。在实际开发中,应根据具体需求选择合适的类型转换方式,并遵循最小权限原则,尽可能减少不必要的类型转换。

h_number_1的博客 935

C++进阶--类型转换

而使用dynamic_cast进行向下类型转换则是安全的,如果父类的指针(或引用)指向的是子类对象,那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象,那么dynamic_cast会转换失败并返回一个空指针。2.由于编译器认为const修饰的变量是不会被修改的,因此会将const修饰的变量存放到寄存器当中,当需要读取const变量时就会直接从寄存器中进行读取,而我们修改的实际上是内存中a的值,因此最终打印出a的值是未修改之前的值。

sushang的博客 1255

从C语言到C++_37(特殊类设计和C++类型转换)单例模式

从C语言到C++_37(特殊类设计(单例模式)和C++的类型转换(static_castreinterpret_cast、const_cast、dynamic_cast)+RTII)。

参考书籍:《C语言程序设计》《数据结构》《C++ Primer》《Effective C++》《STL源码剖析》《现代操作系统》《UNIX环境高级编程》《图解TCP/IP》《图解HTTP》《Linux高性能服务器编程》《剑指Offer》《算法导论》 1052

C++四种类型转换

面试题:C++有多少种cast,它们的名称和功能各是什么。 一种四种。 static_cast 如整型和浮点型、字符型之间的互相转换,void 指针和具体类型指针之间的转换,例如void *转int *、char *转void *等; const_cast 运算符仅用于进行去除 const属性或 volatile 修饰 属性的转换 reinterpret_cast 用于进行各种不同类型的指...

qq826364410的专栏 308

C/C++类型转换全解析

本文介绍了C++中的四种类型转换机制。相比C语言的隐式和显式转换,C++提供了更安全、语义更明确的四种转换方式:static_cast用于相关类型间的转换;reinterpret_cast用于位模式重新解释;const_cast用于修改const/volatile属性;dynamic_cast用于多态类型的运行时安全转换。文章详细分析了每种转换的适用场景、优势及注意事项,强调应避免滥用强制类型转换,特别是危险的reinterpret_cast。最后通过面试题总结了四种转换的应用场景,帮助开发者根据具体需求选

码达拉的博客 1149

【C++】C++的类型转换

今天我们学习了C++中的类型转换,了解了一些有关的底层原理。接下来,我们将继续进行C++的学习。希望我的文章和讲解能对大家的学习提供一些帮助。

Sherry的博客 350

【C++ 第二十二章】C++的类型转换

【含常见面试题】C语言中的类型转换及其缺陷、C++强制类型转换:static_castreinterpret_cast、const_cast、dynamic_cast、自定义类型与”内置类型、自定义类型“之间的转换、RTTI

从不依靠,从不寻找,非常沉默,非常骄傲。 你必须非常努力,才能看起来毫不费力。 1410
上一篇: 《深度探索C++对象模型》- 第4章 Function 语意学
下一篇: 《人月神话》2010-10-30
Erorr
博客等级 码龄20年 90粉丝 144原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值