C++动态绑定(今天阿里的一个机试题)

永夜将尽 2015-08-23 12:16:12

#include <iostream>
using namespace std;
class One{
public:
One(){};
virtual void func(int val = 111111){
cout << "func in One: " << val << endl;
}
virtual void test(){
func();
}
};
class Two : public One
{
public:
Two(){
};
virtual void func(int val = 2222222){
cout << "func in Two: " << val << endl;
}
};
int main(){
One *one = new Two();
one->test();
return 0;
}

//为什么输出结果是输出func in Two: 111111,而不是func in Two: 222222
//哪位大神可以解答下,多谢。


...全文
115 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dustpg 2015-08-23
  • 打赏
  • 举报
回复
默认参数是编译时确定的, 而不是运行时确定
永夜将尽 2015-08-23
  • 打赏
  • 举报
回复
引用 2 楼 wan_ghuan 的回复:
test和func都是虚函数那么当你实例化对象Two时,其内存中虚函数表存的是父类的虚函数test和子类的虚函数func.当你调用函数test时,调得是父类的test,而进入父类函数test后调用func时,那么调那个虚函数是根据虚函数表定的,虚函数表中只有一个子类的func,所以输出就那样了
哥们儿,你仔细阅读我的题目,如果连动态绑定都不知道,面试阿里岂不是自己找虐。。这道题调用的就是子类的func()函数,子类和父类都有默认的形参,但是打印的却是父类的默认形参,而不是子类的默认形参,建议你看看其他3位的回答。
fefe82 2015-08-23
  • 打赏
  • 举报
回复
虚函数调用时,默认参数有调用函数的对象或指针的静态类型(static type)决定。 A virtual function call (10.3) uses the default arguments in the declaration of the virtual function determined by the static type of the pointer or reference denoting the object. An overriding function in a derived class does not acquire default arguments from the function it overrides.
mujiok2003 2015-08-23
  • 打赏
  • 举报
回复
很简单, 实参入栈是编译时确定的, 虽然虚函数调用是动态绑定的。 看看汇编就明白了: push args --> call func
Alex4319 2015-08-23
  • 打赏
  • 举报
回复
test和func都是虚函数那么当你实例化对象Two时,其内存中虚函数表存的是父类的虚函数test和子类的虚函数func.当你调用函数test时,调得是父类的test,而进入父类函数test后调用func时,那么调那个虚函数是根据虚函数表定的,虚函数表中只有一个子类的func,所以输出就那样了

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧