下面是我的测试代码,我认为它会输出“Der:12”,但结果是“Der:11”,任何人都可以告诉我为什么输出这个,以及默认参数存储在哪里?
#include <stdio.h>
class Base{
public:
virtual void show(int i = 11)
{
printf("Base:%d\n", i);
}
};
class Der : public Base{
public:
virtual void show(int i = 12)
{
printf("Der:%d\n", i);
}
};
int main()
{
Base *p = new Der();
p->show();
return 0;
}
答案 0 :(得分:0)
嗯,我不确定使用不同的默认参数覆盖虚函数实际上是有效的,而且肯定不合理。但另一方面,编译器正在做正确的事情,即使它与你的期望相反。
Base *p;
p->show();
这里发生的是编译器查看Base
中没有参数的函数。没有一个,但它找到了单参数函数,并使用默认参数11调用show(int)
。
但是这个函数是虚拟的,所以因为p
的动态类型是Der
,它实际上被Der::show(int)
调用了 - 但至关重要的是,仍然是Base
默认参数为11,但默认参数是静态查找的,而不是使用运行时调度。
我没试过,但我想如果你说
Der *p = new Der();
p->show();
你会得到12输出。