2014-01-21 176 views
0

下面是我的测试代码,我认为它会输出“Der:12”,但结果是“Der:11”,任何人都可以告诉我为什么输出这个,默认参数存储?C++虚函数默认参数值

#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

也在这里... [虚拟函数是否有默认参数?](http://stackoverflow.com/questions/3533589/can-virtual-functions-have-default-parameters) – godel9

回答

0

嗯,我不知道它实际上是有效的覆盖虚拟函数与一个不同的默认参数,它肯定是不明智的。但另一方面,编译器做的是正确的事情,即使它违背了你的期望。

Base *p; 
p->show(); 

这里发生什么是编译器查看Base的函数没有参数。没有之一,但它发现一个参数的功能,并与11

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

我还没有尝试过,但如果你说

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

你会得到12输出,而不是我想像。