下面是我的测试代码,我想它会输出“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;
}发布于 2014-01-21 13:36:03
嗯,我不确定用不同的默认参数覆盖虚拟函数是否有效,而且这肯定是不明智的。但另一方面,编译器正在做正确的事情,即使这与您的期望相反。
Base *p;
p->show();这里发生的事情是,编译器在Base中查找不带参数的函数。虽然没有,但它会找到一个单参数函数,并使用默认参数11调用show(int)。
但是该函数是虚的,因此因为p的动态类型是Der,所以实际调用的是Der::show(int) --但至关重要的是,它仍然使用Base的默认参数11,但默认参数是静态查找的,而不是使用运行时分派。
我还没试过,但我可以想象如果你说
Der *p = new Der();
p->show();相反,你会得到12个输出。
https://stackoverflow.com/questions/21249871
复制相似问题