虚函数与默认实参

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

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

 

如果基类virtual函数中的默认实参和派生类中的默认实参不同,则一定会引起错误。原因在于这个值是在编译时确定,而且只与调用函数的类型有关,而和动态类型无关。也就是说,当动态绑定发生的时候,想要使用派生类中的默认实参,是使用的确实基类的!


#include "stdafx.h"
#include <iostream>
using namespace std;

class Base{
public:
virtual void Print(int a = 1){cout << "Base a:" << a << endl;} 
private:
int b;
};


class Derived : public Base{
public:
void Print(int b = 3){cout << "Derived b:" << b<< endl;} 
private:
int b;
};


int main()
{


Base *bPtr = new Base();
bPtr -> Print(5);
bPtr -> Print();


Derived *dPtr = new Derived();
dPtr->Print(5);
dPtr->Print();


bPtr = dPtr;
bPtr -> Print(5);

bPtr -> Print();//调用省略了默认值的实参,虚函数的动态绑定的,默认实参是静态绑定的
return 0;
}

输出

Base a: 5

Base a: 1

Derived b: 5

Derived b: 3

Derived b: 5

Derived b: 1



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值