针对基类和派生类中的虚函数有没有默认实参问题进行讨论。
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
原因:你会发现虽然调用的是派生类的函数,但是实参确实基类的。这就是比较变态的地方。