(转自自己在其他地方写的,原文已废弃)
为了世界和平,人类进步,社会和谐,请面试官和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 <<