天天看點

面試題:一個短小強悍的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:絕不重新定義繼承而來的預設參數值 的後果,還有一點需要注意,如果父類中的虛函數給出預設參數,而子類中的相應函數沒有預設參數,那麼如果通過子類對象(不是引用或指針)來通路該函數的話,必須指定實參。