当前位置: 首页 > news >正文

C++ : 继承问题 [virtual函数调用,为什么禁止在virtual使用默认参数]

文章目录

  • 子类指针,父类指针分别调用virtual函数,与非virtual函数
  • 虚函数中尽量不要使用默认参数!!!

子类指针,父类指针分别调用virtual函数,与非virtual函数

virtual函数,通过指针调用的是子类函数
非virtual函数,取决于指针的类型

class Person {
public:void Print(){cout << "Person" << endl;}virtual void VirtualPrint(){cout << "VirtualPrint Person" << endl;}
};class Studen : public Person {
public:void Print(){cout << "Student" << endl;}virtual void VirtualPrint(){cout << "VirtualPrint Student" << endl;}
};int main()
{Person *p = new Studen();Studen *s = new Studen();p->Print();     // Persons->Print();     // Studentp->VirtualPrint();  // VirtualPrint Students->VirtualPrint();  // VirtualPrint Studentreturn 0;
}

虚函数中尽量不要使用默认参数!!!

class Father {
public:void func1(int val = 100){cout << "Father \t: func1" << "\t" << val << endl;}virtual void func2virtual(int val = 100){cout << "Father \t: func2" << "\t" << val << endl;}
};class Son : public Father {
public:void func1(int val = 200){cout << "Son \t: func1" << "\t" << val << endl;}virtual void func2virtual(int val = 200){cout << "Son \t: func2" << "\t" << val << endl;}
};

当指针类型与实体类型一致时,很容易分清楚其调用规则

void group1()
{Father *f = new Father();Son *s = new Son();f->func1();s->func1();// Father  : func1 100// Son     : func1 200f->func1(300);s->func1(300);// Father  : func1 300// Son     : func1 300f->func2virtual();s->func2virtual();// Father  : func2 100// Son     : func2 200f->func2virtual(300);s->func2virtual(300);// Father  : func2 300// Son     : func2 300
}

当指针类型与实体类型不一致时,很不容易分清楚其调用规则
在virtual函数中使用默认参数,因为virtual是动态绑定,导致都是调用了子类函数,但是默认参数是根据指针类型来使用的

void group2()
{Father *f = new Son();Son *s = new Son();f->func1();s->func1();// Father  : func1 100// Son     : func1 200f->func1(300);s->func1(300);// Father  : func1 300// Son     : func1 300// virtual func use dynamic func, but use ptr default args// 重点处f->func2virtual();s->func2virtual();// Son     : func2 100// Son     : func2 200// virtual func use dynamic func, use given argsf->func2virtual(300);s->func2virtual(300);// Son     : func2 300// Son     : func2 300
}

http://www.mrgr.cn/news/30592.html

相关文章:

  • linux GPIO
  • Vue自定义指令详解——以若依框架中封装指令为例分析
  • WorkFlow源码剖析——Communicator之TCPServer(下)
  • SL1571B 输入5V2A或单节锂电池,升压12V 10W 升压恒压芯片
  • 刘知远LLM——大模型微调:prompt-learningdelta tuning
  • Redis五种数据类型剖析
  • 向上转移和向下转型
  • U盘显示未被格式化:深入解析、恢复策略与预防之道
  • 网络安全 DVWA通关指南 DVWA Stored Cross Site Scripting (存储型 XSS)
  • 蓝桥杯嵌入式客观题合集
  • 【字符函数】strcpy函数(字符串复制函数)+strcat函数(字符串追加)+strcmp函数(字符串比较)【笔记】
  • 英飞凌最新AURIX™TC4x芯片介绍
  • Lecture 4 Page Table
  • C++—string类接口与用法大总结(其中涉及STL基础)
  • 【Vmware16安装教程】
  • 登录后继续执行方法
  • pg入门3—详解tablespaces2
  • RK3568平台(网络篇)MAC地址烧录
  • 【LabVIEW】事件结构的用法
  • 消息队列-Kafka(概念篇)
  • 小琳AI课堂:强化学习初阶
  • OJ在线评测系统 前端开发设计优化通用菜单组件二 调试用户自动登录
  • JavaFX实现视频播放功能
  • SPI接口通信协议浅谈成都自动化开发
  • yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】
  • Linux 后台运行服务的全攻略:nohup、screen、tmux 和 systemd 的实战指南