虚函数与默认实参

针对基类和派生类中的虚函数有没有默认实参问题进行讨论。

1.基类虚函数不带参数,派生类带参数

#include<iostream>
using namespace std; 
	
class super 
{
     public:
        virtual void somemethod()const { cout<<"base" << endl; }
};

class sub : public super 
{
     public:
        virtual void somemethod(int i = 12)const { cout<<"sub" << "i = " << i <<endl; }
};


int main(void)
{
        sub mysub;
        super &ref = mysub;
        ref.somemethod();    // 调用哪个?
        
        return 0;
}
输出: base

调用的是基类的,派生类是基类这个函数的重新定义的版本,不是基类函数的重载版本。


2.基类虚函数不带参数,派生类带参数

#include<iostream>
using namespace std; 
	
class super 
{
	public:
            virtual void somemethod(int i = 21)const {cout<<"base"<<"i = "<< i <<endl;}
};

class sub : public super 
{
	public:
	    virtual void somemethod()const { cout<<"sub" << "i = " << i <<endl; }
};


int main(void)
{
        sub mysub;
        super &ref = mysub;
        ref.somemethod();    // 调用哪个?
        
        return 0;
}
输出:

Base i = 21

原因和上面的一样。


3.基类虚函数带参数,派生类带参数,且默认实参是一样的。

#include<iostream>
using namespace std; 
	
class super 
{
	public:
        virtual void somemethod(int i = 12)const {cout<<"base "<<"i = "<< i <<endl;}
};

class sub : public super 
{
	public:
        virtual void somemethod(int i = 12)const {cout<<"sub "<<"i = "<< i <<endl;}
}


int main(void)
{
        sub mysub;
        super &ref = mysub;
        ref.somemethod();    // 调用哪个?
        
        return 0;
}
输出:sub i = 12


4.基类虚函数带参数,派生类带参数,且默认实参不一样的。

#include<iostream>
using namespace std; 
	
class super 
{
	public:
        virtual void somemethod(int i = 12)const {cout<<"base "<<"i = "<< i <<endl;}
};

class sub : public super 
{
	public:
       virtual void somemethod(int i = 21)const { cout<<"sub " << "i = " << i <<endl;}
};


int main(void)
{
        sub mysub;
        super &ref = mysub;
        ref.somemethod();    // 调用哪个?
        
        return 0;
}
输出: sub i = 12

原因:你会发现虽然调用的是派生类的函数,但是实参确实基类的。这就是比较变态的地方。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值