栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

坚持学习100天:多态(函数重载,虚函数以及多态)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

坚持学习100天:多态(函数重载,虚函数以及多态)

前言

Hello,我是修齊。
学习C++的第一百零一十天,将近五一假期了,不浪漫亦是罪名,男生今年不能再挨批斗了,放假就得好好陪陪身边的人浪漫浪漫,生活,加油,学习加油。
在这里记录一些学习的东西和学习的心情,内容主要是一些自己学习整理的小笔记。

一、多态

1.一个接口,多种实现:同一种事务表现出来的多种形态
2.面向对象的多态性可分为四类:重载多态、强制多态、包含多态、参数多态
3.专用多态:重载多态和强制多态;通用多态:包含多态和参数多态
4.包含多态:定义于不同类中的同名成员函数的多态行为,主要通过虚函数来实现
5.实现角度分:编译时的多态和运行时的多态
6.编译时的多态:编译的过程中确定同名操作的具体操作对象
7.运行时的多态:程序运行过程中动态地确定操作所针对的具体对象
8.联编:确定操作的具体对象的过程叫联编
9.联编:计算机程序自身彼此关联的过程,把一个标识符名和一个存储地址联系在一起的过程(面向对象的术语:把一条消息和一个对象的方法相结合的过程)
10.联编进行阶段不同分两种联编方法:静态联编和动态联编,对应多态的两种实现方式
11. 多态作用:统一的标识完成函数功能,减少程序中标识符的个数
12. 多态性提供把接口和实现分开的另一种方法
13. 多态是一种行为的封装,只需早知道操作对象所能够做的事情(接口),具体怎么做由多态自己去决定

二、多态的引入

1.没有使用多态的情况下,结果输出:animal breathe。主函数先定义了fish类的对象fh,接着定义指向animal类的指针变量pAn,将fh的地址赋给了指针变量pAn,再利用该变量调用pAn->breathe()。
2.编译器编译时,对每个对象调用的函数的地址进行早期绑定(early binding),当fish类的对象fh的地址赋给pAn时,编译器进行了类型转换,默认变量pAn保存的就是animal对象的地址,当执行pAn->breathe()时,调用的就是animal对象的breathe函数。
3.构造fish类的对象时,系统调用基类animal类的构造函数去构造animal类的对象,然后再调用fish类的构造函数完成新增部分的构造,两个加起来才拼接成完整的对象。
4.当fish类的对象转换为animal类型时,该对象被认为时animal对象所占内存部分,当利用转换类型后的对象指针调用它的方法时,也就是调用它所在内存中的方法。输出:animal breathe

class animal
{
public:
   void sleep()
   {
      cout << "animal sleep"<
      cout<<"animal breathe"<
public:
   void breathe()
   {
      cout<<"fish bubble"<
   fish fh;
   animal *pAn=&fh;
   pAn->breathe();
}

三、函数重载

1.静态联编支持的多态性称为编译时的多态性或静态多态性
2.静态多态性:确定同名操作的具体操作对象的过程是在编译过程中完成的
3.实现编译时的多态性的方式:函数重载、运算符重载
4.动态联编支持的多态性称为:运行时的多态性或动态多态性
5.动态多态性:确定同名操作的具体操作对象的过程是再运行过程中完成的
6.实现运行时的多态性的方式:继承、虚函数
7.函数重载=多态函数,是实现编译时的多态性的形式之一(虚函数应该也是一个,猜的。)
8.函数重载作用:能用同一个名字来访问一组相关的函数,提高程序的灵活性
9.函数重载时,函数名相同,函数所带的参数个数和数据类型不同(1.参数个数或类型有所差别的重载;2.函数参数完全相同但属于不同的类)
10.区分调用哪个类的同名函数方法:(1.对象名区别:函数名前加上对象名来限制“对象名.函数”;2.类名和作用域运算符::加以区别:函数名前加“类名::”来限制“类名::函数名”)

class point//定义基类point
{
   int x,y;
public:
   point(int xx,int yy)//定义基类构造函数
   {
       x=xx;
       y=yy;
   }
   double area()//定义基类的成员函数
   {
       return 0.0;
   }
};
class circle:public point//派生类公有继承于基类
{
   int t;
public:
   circle(int xx,int y,int rr):point(xx,yy)//定义派生类构造函数
   {
       r=rr;
   }
   double area()//同名函数
   {
       return 3.1416*r*r;
   }
};
void main()
{
   point pob(15,15);//创建基类对象
   circle cob(20,20,10);//创建派生类对象
   cout<<"pob.area()=“<class base//定义基类base
{
private:
   int x,y;
public:
   base(int xx-0,int yy-0)//定义构造函数
   {
      x=xx;//定义基类私有成员
      y=yy;
   }
   void disp()//定义成员函数
   {
      cout<<"base:"<
private://定义派生类的私有成员
   int z;
public:
   base1(int xx,int yy,int zz):base(xx,yy)//定义派生类的构造函数
   {
      z=zz;
   }
   void disp()//定义同名函数
   {
      cout<<"base:"<
   base obj(3,4),*objp;//创建基类的对象和对象指针
   bse1 obj1(1,2,3,4);//创建派生类的对象
   objp=&obj;//对象指针指向基类
   objp->disp();//调用基类成员函数
   objp=&obj1;//对象指针指向派生类
   objp->disp();//调用派生类成员函数
}
                                        
五、待续

1.定义虚函数、使用虚函数
2.多重继承和虚函数
3.还没完,我还会回来的。。。哈哈哈

上述内容如有侵权,联系即删。
感谢阅读-感谢支持

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847562.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号