首页 > 其他分享 >什么是多态?什么是虚函数?

什么是多态?什么是虚函数?

时间:2023-06-17 10:00:54浏览次数:25  
标签:函数 子类 什么 多态 父类 nameshow 指针

1,什么是多态?

多态是指同样的消息被不同类型的对象界首市导致的不同行为,所谓小学时只对类的成员函数调用,不同的行为是指不同的实现,也就是调用了不同的函数。多态性提供接口与具体实现之间的另一层隔离,同时创建了使程序具有扩展性。事实上在程序设计中经常使用多态,的特性,最近简单的例子就是运算符对不同类型的数据对象运算。


多态的类型一般分为两类:


静态多态(编译时多态,早绑定):函数重载、运算符重载、重定义


动态多态(运行时多态,晚绑定):虚函数 父类指针(引用)保存 子类空间地址的目的 就是让算法通用。

什么是多态?什么是虚函数?_多态

2,什么是虚函数?

1.如何实现父类对各个派生子类的操作?

这里的操作是在继承父类成员的条件下,对子类继承的成员的操作,也就是调用


首先要实现父类对各个派生子类的操作,我们需要父类指针保存子类空间,利用这个方式实现父类算法通用。



总结:通过构建父类指针保存子类的空间,实现对各个子类的操作(实际上这里还并不行,但这是实现该功能的前提)!


在这个基础上,构建虚函数或者纯虚函数他才会成立,在主函数中有应当如何去调用,都是父类指针保存子类空间的这个前提!!


2,父类指针保存子类空间产生的问题。

我们的目的是需要操作各个子类,虽然实现了如何访问哥哥派生子类,但实际上还并未能操作子类。



#include<iostream>

using namespace std;

  
class animal

{

public:

	void nameshow()

	{

  cout << "我是什么动物" << endl;

	}

  
};

  
class cat :public animal

{

public:

	void nameshow()

	{

  cout << "我是猫" << endl;

	}

};

  
int main()

{

	//通过父类指针保存子类空间,实现对各个派生类的操作

	animal* p = new cat;

	//但我们这里想要调用的是子类的成员,但结果是父类的成员

	p->nameshow();

	return 0;

  
}

由上例知道,通过父类指针保存子类空间是没问题的,但因为你是父类指针,调用时不是操作子类,而是父类,故还并未实现父类对子类的操作,此时我们在定义父类成员(一般为函数)时就添加了关键词virtual,也就是虚函数,引入虚函数,我们可以实现父类对子类的调用。


3,虚函数的定义

父类成员函数前加virtual修饰。


#include<iostream>

using namespace std;

  
class animal

{

public:

	virtual void nameshow()

	{

  cout << "我是什么动物" << endl;

	}

  
};

  
class cat :public animal

{

public:

	void nameshow()

	{

  cout << "我是猫" << endl;

	}

};

class dog :public animal

{

public:

	void nameshow()

	{

  cout << "我是狗" << endl;

	}

};

  
int main()

{

	//通过父类指针保存子类空间,实现对各个派生类的操作

	animal* p1 = new cat;

	animal* p2 = new dog;

	//成功调用

	p1->nameshow();

	p2->nameshow();

	return 0;

  
}

通过关键词virtual我们将成员函数定义为虚函数,此时父类指针指向子类空间时,我们调用的就是子类的这个成员函数。


多态条件:有继承、子类重写父类的虚函数,父类指针 指向子类空间。


我们可将子类继承父类的成员当做链接父类与子类的桥梁,父类指针指向各个子类空间就是实现各个桥梁,virtual就是实现父类通过桥梁到子类。

标签:函数,子类,什么,多态,父类,nameshow,指针
From: https://blog.51cto.com/u_16121555/6504565

相关文章

  • C++面试八股文:什么是左值,什么是右值?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第16面:面试官:什么是左值,什么是右值?二师兄:简单来说,左值就是可以使用&符号取地址的值,而右值一般不可以使用&符号取地址。inta=42; //a是左值,可以&aint*p=&a;int*p=&42; //42是右值,无法取地址二师兄:一般左值存在内存......
  • 【初识C++】(缺省参数和函数重载)
    @TOC一、缺省参数1.缺省参数定义缺省参数是在函数的声明中给定参数一个指定的值。如果传参没有给定参数,那就按照声明中默认的缺省值,如果给定了参数,那就按照给定的参数值。比如:usingnamespacestd;voidFunc(inta=0){ cout<<a<<endl;}intmain(){ Func(); //......
  • Day01 1.3 什么是Root设备
    Day011.3什么是Root设备【一】什么是rootROOT是指获取安卓设备(手机或平板电脑)的超级用户权限,也被称为管理员或根用户权限。通过Root手机,用户可以获得对操作系统的完全控制权限,可以访问和修改系统文件、安装自定义固件、运行需要Root权限的应用程序等。Root权限的好处包......
  • Scala方法和函数
    方法和函数的作用几乎是一样的,但是函数在使用的过程中更加灵活和多样化scala中函数是头等公民.可以作为方法的返回值和参数使用scala是一个集面向对象和面向函数于一身的编程语言,灵活的函数是函数式编程的一种体现函数的使用使代码更加简洁和灵活函数scala中一种函数......
  • js的new做了什么
    new对象底层发生了什么functionPerson(phone,age){this.age=age;this.phone=phone;this.showone=function(){};}Person.prototype.docall=function(){console.log("电话:",this.phone);};letperson=newPerson("12344",23);c......
  • Jmeter-函数助手之时间函数生成明天、今天、昨天的时间
    JMeter中的_timeShift函数可用于将本地时间与UTC时间之间进行转换。下面是一个使用_timeShift函数的示例:假设你需要在测试过程中捕获当前的本地时间,并将其用作请求参数中的时间戳。假设你的请求参数中需要一个时间戳参数,它的格式为“yyyy-MM-dd'T'HH:mm:ssZ”,其中Z代表UTC时......
  • 医疗虚拟仿真和虚拟现实有什么区别?哪个更好?
    随着我们在仿真教育中越来越多地使用新技术,区分虚拟模式的类型很重要。虚拟仿真是一个统称,用来概括术语来描述各种基于仿真的体验,从基于屏幕的平台到沉浸式虚拟现实。然而,各虚拟平台在保真度、沉浸感和临场感的水平上有很大差异。医疗教育中存在许多虚拟解决方案的空间,对于护理虚......
  • 螺杆支撑座到底是做什么用的?
    在制造业中,人们最常接触的就是直线导轨和滚珠螺杆,往往会会忽略了体积小的螺杆支撑座,事实上,螺杆支撑座是搭配滚珠螺杆一起使用的,两者是相辅相成的。螺杆支撑座的应用功能非常重要,是连接螺杆和电机之间的重要组成,目前来说,使用非常广泛,像机械手、自动化设备、减速机、车床、磨床、钻床......
  • OPPO什么时候关停自研芯片公司哲库?
    公元2023年5月12日,OPPO关停了自研芯片公司哲库。这也是汶川大地震的日子,而OPPO创始人是四川人,真是冥冥之中自有天意。OPPO公司在一份声明中表示,出于商业考量,他们决定即时起关停哲库(ZEKU)业务,终止自研芯片的研发。OPPO表示,这是一个艰难的决定,但是面对全球经济和手机市场的挑战,他们......
  • 什么是工单系统?工单系统在现代企业管理中的重要性
    随着信息技术的不断发展,现代企业管理工作已经离不开各种数字化工具的支撑。其中,工单系统作为一项重要的任务分配和协作工具,已经成为了不可或缺的一部分。工单系统可以根据不同的需求针对性地发布工单,进行针对的工作处理,从而实现任务分配和工作流程的监控,提高整体的工作效率。在现......