C ++虚函数默认参数值

时间:2014-01-21 05:29:18

标签: c++ class default-value

下面是我的测试代码,我认为它会输出“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;
}

1 个答案:

答案 0 :(得分:0)

嗯,我不确定使用不同的默认参数覆盖虚函数实际上是有效的,而且肯定不合理。但另一方面,编译器正在做正确的事情,即使它与你的期望相反。

Base *p;
p->show();

这里发生的是编译器查看Base中没有参数的函数。没有一个,但它找到了单参数函数,并使用默认参数11调用show(int)

但是这个函数是虚拟的,所以因为p的动态类型是Der,它实际上被Der::show(int)调用了 - 但至关重要的是,仍然是Base默认参数为11,但默认参数是静态查找的,而不是使用运行时调度。

我没试过,但我想如果你说

Der *p = new Der();
p->show();

你会得到12输出。