虚函数的疑问?

为什么输出son:0,而不是son:1?

为什么把caseback删去就输出son:1?

#include<iostream>
using namespace std;

class Base{
public:
	virtual void f(int val=1){
		cout<<"B: "<<val<<endl;
	}
	virtual void caseback(){
		f();
	}
};

class Son:public Base{
public:
	void f(int val=0){
		cout<<"Son: "<<val<<endl;
	}
	void caseback(){
		f();
	}
};

int main(){
	Base* d=new Son;
	d->caseback();
	return 0;
}

全部评论
问题1:为什么输出 Son: 0,而不是 Son: 1? 当你调用 d->caseback() 时,因为 caseback 函数是虚函数,会调用 Son 类中的 caseback 函数。在 Son 类中的 caseback 函数调用的是 Son 类的 f 函数,并使用了默认参数 0,所以输出 Son: 0。 问题2:为什么把 caseback 删去就输出 B: 1? 如果删除 Son 类中的 caseback 函数定义: class Son:public Base{ public: void f(int val=0){ cout<<"Son: "<<val<<endl; } // void caseback(){ // This function is removed // f(); // } }; 在这种情况下,当你调用 d->caseback() 时,因为 caseback 函数没有在 Son 类中重写,所以会调用 Base 类中的 caseback 函数。Base 类中的 caseback 函数调用 f(),而因为 f 是虚函数,会调用 Son 类中的 f 函数。但这里有一个关键点:Base 类中的 f 函数的默认参数是 1,而 Son 类中的 f 函数的默认参数是 0。 虚函数的默认参数是在编译时确定的,而不是在运行时确定的。由于 Base 类中的 caseback 函数调用 f() 时,使用的是 Base 类的 f 函数的默认参数 1,因此最终调用的是 Son 类的 f 函数,但参数值是 1,所以输出 Son: 1。 总结: • 当 Son 类中定义了 caseback 函数时,caseback 使用的是 Son 类的 f 函数的默认参数 0。 • 当 Son 类中没有定义 caseback 函数时,Base 类的 caseback 函数使用的是 Base 类的 f 函数的默认参数 1,即使实际调用的是 Son 类的 f 函数。
1 回复 分享
发布于 07-20 14:14 浙江

相关推荐

1 1 评论
分享
牛客网
牛客企业服务