天天看点

面试题:一个短小强悍的C++面试题---违背Effective C++的条款37:绝不重新定义继承而来的缺省参数值

转自:http://blog.csdn.net/zjq2008wd/article/details/18559871#comments

#include<iostream>
using namespace std;
class Base{
public:
virtual void show(int i=10){
    cout<<"Base show i="<<i<<endl;
  }
  virtual ~Base(){}
};
class Derived:public Base{
public:
virtual void show(int i=20){
  cout<<"Derived show i="<<i<<endl;
}
virtual ~Derived(){}
};

int main(){
  Base* bp=new Derived();
  bp->show();
}
           

输出:Derived show i=10

知识点:赋值兼容,多态,默认参数的静态绑定

bp->show(); 调用的是derived的虚函数,但是c++的默认参数是静态绑定(根据静态类型决定)的,所以传进来的是base的默认参数。

参见C++primer第4版 p482

深入理解,其实这就是违背违背 Effective C++的条款37:绝不重新定义继承而来的缺省参数值 的后果,还有一点需要注意,如果父类中的虚函数给出默认参数,而子类中的相应函数没有默认参数,那么如果通过子类对象(不是引用或指针)来访问该函数的话,必须指定实参。