面试题 - reinterpret_cast

在面试中遇到的挑战性问题:如何在不修改A和B类的情况下,取消C类对B的继承并解决编译问题。讨论了使用组合替代继承,以及当涉及virtual函数时reinterpret_cast的复杂性,揭示了对C++特性如mutable的深入考察。
摘要由CSDN通过智能技术生成

最近参加了一些面试,总是能遇见一些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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值