[变态的C++]“迷路”的函数调用错误

本文探讨了在C++中如何制造函数调用错误,即调用一个函数却执行了另一个函数。文章提出了多个方案,包括利用作用域、函数指针、运算符重载、类型误用等手法,分析了这些方法如何误导程序员,尽管编译器并未出错。文章鼓励读者尝试自己找出解决方案,并提供了10个示例,其中有一个完全满足题目要求。
摘要由CSDN通过智能技术生成

(转自自己在其他地方写的,原文已废弃)

为了世界和平,人类进步,社会和谐,请面试官和C/C++老师绕道,灰常感谢。


相信你也同意C++是一门很变态的语言,不同意的话,不妨尝试下这个问题(据说是个面试题):

在C++中,我们调用了某个函数,但实际执行情况是“调用错了”,就是说没有执行你所期望的那个函数,调用发生了错误,考虑这是怎么做到的?

具体地来说,就是我们定义两个函数,我们调用了一个函数,执行的却是另一个函数。类似于在下面的代码中加些东西,也可以把函数放进类中,对函数改名加些参数或者修改修饰符,或者再写一些辅助函数都可以,总之让它输出的不太对。

void a(){
  cout << "func a" << endl;}
void b(){
  cout << "func b" << endl;}
// === 加些代码 ===
b(); // 输出func a

我们假设编译器是没有bug的,它知道它在干什么,它试图连接的函数和您的期望是一样的。另外,不要直接读写内存区域。

好吧,首先希望您能静下心来想一想这个问题,我建议你暂时先收藏下,然后想清楚了再继续看。如果您实在感到奇怪,您可以先无视我前面提到的一些条件。另外作为善意提醒,我建议您还是要尝试编写代码,我在撰写本文时,一些想到的方案最后费了很长的时间才最终实现。



相信您读到这里时已经有了不少想法了。本文将给出10个方案,不过只有一个完全满足前面的条件。
现在我可以开始我的尝试,一个入手的想法就是利用scope,下面这个例子从某种程度上来说达到了效果(所有的例子均在VC2010,x86下通过,所有的程序都需要加上标准输入输出的头和std命名空间的使用)

//方案甲
void a(){
  cout << "func a" << endl;}
void b(){
  cout << "func b" << endl;}

int main()
{
    void (*b)()=&a; // 作用域
    b(); // 输出func a
    return 0;
}

这个例子没有给出类,不过将这两个函数作为静态函数和执行代码放入类中是一样的。这个方案利用了函数指针和scope的误解,这个误解属于人类而不是编译器,所以并不是符合要求的方案,类似的方案还有

//方案乙 
void print(){
  cout << 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值