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

C++多态性——(3)动态联编的实现——虚函数

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
成功的秘诀就在于多努力一次!

一起加油!

目录

一、前言:

二、虚函数的声明:

三、虚函数的调用: 

💦        例:虚函数实现动态联编。

🔑说明:

四、总结:

五、共勉: 


一、前言:

        上一节中,基类的指针既可以指向基类的对象,又可以指向派生类的对象。但是,当它指向派生类的对象时,并没有按照期望调用派生类中的GetArea()函数它仍然调用基类的GetArea()函数导致运行结果出错。要解决这个问题就要用虚函数。
        虚函数是实现动态联编的基础,它是一种动态的重载方式,它允许在运行时建立函数调用与函数体之间的联系,也就是在运行时才决定如何动作,即动态联编。
        基类的指针指向它的公有派生对象时,访问公有派生类中继承自基类的公有成员,可采用显式的方法,如GetArea(),或采用指针强制类型转换的方法:

p=&r;
p->GetArea();

        但这两种方法都没有达到动态调用的效果,若要实现动态的调用功能,需要将函数Area0声明为虚函数。

二、虚函数的声明:

        虚函数是一个在基类中声明为 virtual的函数,并在一个或多个派生类中被重新定义的成员函数,虚函数的声明格式如下:


                        virtual <返回值类型><函数名>(<参数表>);

        虚函数的定义非常简单,就是基类的函数加上一个 virtual说明,基类中声明为 virtual的函数一般在派生类中需要重新定义。

        在重新定义时,参数的类型和个数必须相同,一旦一个函数被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都继续保持虚函数特性。 

三、虚函数的调用: 

        如果某个类中一个成员函数被说明为虚函数,意味着该成员函数在派生类中可能有不同的函数实现,当使用对象指针或对象引用调用虚函数时,采用动态联编方式,即在运行时进行关联或绑定。

💦        例:虚函数实现动态联编。

#include<iostream>
using namespace std;
class mybase
{private:int a,b;public:mybase(int x,int y):a(x),b(y){    }virtual void show(){cout<<"基类 mybase"<<endl;cout<<a<<" "<<b<<endl;	}	
};
class myclass:public mybase
{private:int c;public:myclass(int x,int y,int z):mybase(x,y),c(z){ 	}void show(){cout<<"派生类 myclass"<<endl;cout<<"c="<<c<<endl; }
};
int main()
{mybase mb(50,50),*pm;myclass mc(10,20,30);pm=&mb;pm->show();pm=&mc;pm->show();return 0;
}

🔑说明:

        (1)虚函数与重载不同,虚函数参数类型个数完全相同。
        (2)定义一个基类的对象指针或者基类对象引用,就可以指向不同派生类的对象同时调用不同派生类的虚函数。这就是动态联编的结果。 

四、总结:

  • 虚函数的定义非常简单,就是基类的函数加上一个 virtual说明,基类中声明为 virtual的函数一般在派生类中需要重新定义。
  • 在重新定义时,参数的类型和个数必须相同,一旦一个函数被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都继续保持虚函数特性。 
  • 虚函数与重载不同,虚函数参数类型个数完全相同。
  • 定义一个基类的对象指针或者基类对象引用,就可以指向不同派生类的对象同时调用不同派生类的虚函数。这就是动态联编的结果。 

五、共勉: 

        以上就是我对C++多态性——(3)动态联编的实现——虚函数的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++多态性的理解,请持续关注我哦!!! 

http://www.lryc.cn/news/272417.html

相关文章:

  • docker部署mysql
  • python代码大全(持续更新)
  • C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 处理程序异常相关技术
  • [python]项目怎么使用第三方库
  • java每日一题——双色球系统(答案及编程思路)
  • java的mybatis
  • Linux驱动开发简易流程
  • 基于springboot的靓车汽车销售网站
  • 爬取涛声网音频
  • 如何快速且有效的学习自动化测试?
  • openmmlab大模型实战营01
  • HarmonyOS-ArkTS基本语法及声明式UI描述
  • 字符串转成时间的SQL,一个多种数据库通用的函数
  • CMake入门教程【核心篇】查找包(find_package)
  • Stable Diffusion好用的显卡推荐
  • Spring 对请求参数的优雅处方式(重写序列化方法)
  • 2024年中职“网络安全“—数字调查取证(attack817.pcapng)
  • 如何使用VsCode编译C语言?
  • SpringCloud 和 Linux 八股文第三期五问五答
  • 组件通信方式
  • kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?
  • Linux账户安全
  • 深度生成模型之GAN优化目标设计与改进 ->(个人学习记录笔记)
  • 程序员如何高效学习技术?
  • 一个无经验的大学毕业生,可以转行做软件测试吗?我的真实案例
  • 三.Linux无名管道(PIPE)和有名管道(FIFO)的区别
  • 英文字母替换加密(后移n位)
  • HAproxy群集
  • LeetCode2469. Convert the Temperature
  • 【ROS2】MOMO的鱼香ROS2(五)ROS2入门篇——ROS2接口与自定义