默认实参与虚函数

在虚函数中,我们也可以为其指定默认实参。但是它和普通函数指定默认实参虽然表面看起来一样,实际上有很大的区别。

如下代码所示:

#include<iostream>
using namespace std;
class Base
{
public:
	virtual void f1(int i = 0);
};
class Override :public Base
{
public:
	virtual void f1(int i = 100);
};
void Base::f1(int i)
{
	cout << i << endl;
}
void Override::f1(int i)
{
	cout << i << endl;
}
int main()
{
	Override O;
	Base &B = O;
	B.f1();
	Base B2;
	B2.f1();
	system("pause");
	return 0;
}

我们通过基类引用调用虚函数,还用了基类直接调用虚函数,理论上来说应该第一个调用派生类的f1,第二个调用的是基类的f1,可是实际上并非如此,输出结果也并非100 '\n' 0 而是 0 '\n' 0 。

看上去好像是调用了两次基类的派生类,可并非如此。仍然是第一个调用派生类的f1,第二个调用的是基类的f1。只不过默认实参由于某些性质全用了基类的默认实参。

总结:在虚函数指定默认实参时候,最好都取一模一样的默认实参!!!

Pass:当你不需要虚函数多态性质可以用类作用域限定符限定。尤其是虚函数调用虚函数(必须指定,不然陷入无穷的死循环).

猜你喜欢

转载自blog.csdn.net/qq_41657315/article/details/80920131