Default arguments and virtual function

 

  

  Predict the output of following C++ program.

 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 )
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 }

  Output:

  Derived::fun(), x = 0
    

  If we take a closer look at the output, we observe that fun() of derived class is called and default value of base class fun() is used.
  Default arguments do not participate in signature of functions. So signatures of fun() in base class and derived class are considered same, hence the fun() of base class is overridden. Also, the default value is used at compile time. When compiler sees that an argument is missing in a function call, it substitutes the default value given. Therefore, in the above program, value of x is substituted at compile time, and at run time derived class’s fun() is called.

 

  Now predict the output of following program.

 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 ) // NOTE THIS CHANGE
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 }

  The output of this program is same as the previous program. The reason is same, the default value is substituted at compile time. The fun() is called on bp which is a pointer of Base type. So compiler substitutes 0 (not 10).

  In general, it is a best practice to avoid default values in virtual functions to avoid confusion.

 

 

  Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
  

  转载请注明:http://www.cnblogs.com/iloveyouforever/

  2013-11-26  20:18:49

转载于:https://www.cnblogs.com/iloveyouforever/p/3444049.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值