c++ 虚函数与默认实参

    c++ primer 中原文:

          像其他任何函数一样,虚函数也可以有默认实参。 通常, 如果有用在给定调用中的默认实参值, 该值在编译时确定。如果一个调用省略了具有默认值的实参, 则所用的值由调用该函数的类型定义, 与对象的动态类型无关。 通过基类的引用或指针调用虚函数时, 默认实参为在基类虚函数声明中指定的值, 如果通过派生类的指针或引用调用虚函数, 则默认实参是在派生类的版本中声明的值。 

           在同一虚函数的基类版本和派生类版本中使用不同的默认实参几乎一定会引起麻烦。如果通过基类的引用或指针调用虚函数, 但实际执行的是派生类中定义的版本,这时就可能会出现问题。 在这种情况下, 为虚函数的基类版本定义的默认实参将传给派生类定义的版本, 而派生类版本是用不同的默认实参定义的。


#include <iostream>
using namespace std;
class A
{
  public:
    virtual void Display( int i=0 )
    {
        cout<<"A:  "<<i<<endl;
    }  

};

class B : public A
{
   public:
    virtual void Display( int i=1 )
    {
        cout<<"B:  "<<i<<endl;
    }

};

int main()
{
 
  B b;
  A *p = &b;
  
  p->Display(4);
  p->Display();  //virtual是动态绑定,而缺省参数值却是静态绑定

  return 0;
}



结果如下:


 第二行并不是我们想要的结果, 我们期望的输出应该是B: 1。 这也印证了 如果一个调用省略了具有默认值的实参, 则所用的值由调用该函数的类型定义, 与对象的动态类型无关 这句话。  


effective  条款37 中提到  :  virtual 函数是动态绑定, 而缺省参数值却是静态绑定。

请记住:  绝对不要重新定义一个继承而来的缺省参数值, 因为缺省参数值都是静态绑定, 而virtual函数 --你唯一应该覆写的东西----却是动态绑定。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值