基类和子类中虚函数的参数默认值值不同的情况

====================================================||

欢迎讨论技术的可以相互加微信:windgs (请备注csdn+xx职业)

====================================================||

1.虚函数中的默认值

根据输出结果,可以看到最终调用的是子类的fun()函数,并且使用了基类函数fun()中的默认值
默认参数是不会做为判断函数是否相同的因素的。所以子类与基类中的fun()函数被认为是相同的,这样基类的fun()函数被隐藏了。另外,默认值是在编译期间使用的。当编译器看到一个函数调用中的某个参数缺失了,它就会用默认提供的值来替换。因此,上面程序中,x的值在编译期间被替换了,在运行时期间调用的是子类的fun()函数。

2.基类默认值覆盖子类默认值

 

参考下面程序的结果:

#include <iostream>
using namespace std;
 
class Base
{
public:
    virtual void fun ( int x =100) //如果此处基类没有默认值,而子类去写了默认值直接编译报错。
    {
        cout << "Base::fun(), x = " << x << endl;
    }
};
 
class Derived : public Base
{
public:
    virtual void fun ( int x=999 )//编译期间就会被替换成基类的默认参数100 //子类写与不写默认值都可以,都是使用基类的默认值
    {
        cout << "Derived::fun(), x = " << x << endl;
    }
};

int main()
{
    Derived d1;
    Base *bp = &d1;
    bp->fun();
    return 0;

}

输出:

  1. #include <iostream>

  2. using namespace std;

  3.  
  4. class Base

  5. {

  6. public:

  7. virtual void fun ( int x = 0)

  8. {

  9. cout << "Base::fun(), x = " << x << endl;

  10. }

  11. };

  12.  
  13. class Derived : public Base

  14. {

  15. public:

  16. virtual void fun ( int x = 10 ) // 注意这里的变化

  17. {

  18. cout << "Derived::fun(), x = " << x << endl;

  19. }

  20. };

  21.  
  22.  
  23. int main()

  24. {

  25. Derived d1;

  26. Base *bp = &d1;

  27. bp->fun();

  28. return 0;

  29. }

输出:
Derived::fun(), x = 0

这个程序的结果与前面的程序是一样的。原因也是一样的,默认值在编译期间被替换了。bp是基类类型的指针,调用fun函数时,编译器用0替换掉了10.

 

总的来说,应该尽量避免在虚函数中使用默认值,这样可以避免遇到一些意想不到的结果。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值