虚函数的疑问?

为什么输出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 回复 分享
发布于 2024-07-20 14:14 浙江

相关推荐

Kurumis:整个简历看下来就发现你其实对测试理解还很浅,很多地方都是硬凑上去,项目也是学生课设级别,没什么含金量 首先是学习建议: 1.系统性了解一个真实工程的框架,有利于你后续提升项目含金量,理解测试的逻辑 2.真正去学一下自动化测试和性能测试 再就是简历本身包装问题: 1.投测试的话就不要说自己独立开发自己测,专注描述自己怎么做测试的 2.项目经历太像套话,很容易让人怀疑你到底真的做过没有,比如并发是具体做了多少并发?自动化脚本是怎么跑兼容性和性能测试的?测试用例写了多少条? 3.教务管理系统一听就是数据库课设作业,含金量不高,不过你可以在原项目基础上重构扩展,比如添加docker容器部署MySQL和Redis,添加消息队列和锁机制防止系统扛不住高并发访问,让它真的像个实际工程 4.技能里性能专项测试没有把握不要乱写,就写你会什么工具就行了,做专项性能测试的都是行业大佬,你要写的话一定要有对应的专项性能测试项目 5.可以在简历里附上项目链接,压缩简历内容的同时提升简历真实性
今天你投了哪些公司?
点赞 评论 收藏
分享
03-31 00:39
门头沟学院 C++
南岗痞子:不还有俩没结束吗
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务