c++之多态

2 篇文章 0 订阅

一、多态性的概念

多态性是面向对象程序设计的一个重要特征。如果一个语言只支持类而不支持多态,是不能称为面向对象语言的,只能说是基于对象的,如Visual Bsaic。c++支持多态性,利用多态性可以设计和实现一个易于扩展的系统。
c++中这样描述多态:向不同的对象发送同一个信息,不同的对象在收到时会产生不同的行为。
所谓消息,就是调用函数,不同的行为,就是不同的实现,即执行不同的函数。
在c++中,多态的表现形式之一是:具有不同功能的函数可以用同一个函数名,这样就可以实现用一个函数名调用不同内容的函数。
从系统的角度来看,多态分为两类:静态多态性和动态多态性。
静态多态性是通过函数重载实现的。由函数重载和运算符重载(运算符重载实质上也是函数重载)形成的多态性属于静态多态性,要求在程序编译时就知道调用函数的全部信息,因此在程序编译时就能决定要调用哪个函数,静态多态性又称吧编译时多态性
动态多态性的特点是:不在编译时确定调用哪个函数,而是在程序运行过程中才动态地确定操作所针对的对象,又称为运行时多态。
动态多态性时通过虚函数实现的。

二、利用虚函数实现动态多态性

1.虚函数的作用

所谓虚函数,就是在基类声明函数时虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数。
虚函数的作用时允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或者引用来访问基类和派生类的同名成员函数。
注意:
由虚函数实现的多态功能就是,同一类簇中不同类的对象,对同一函数调用作出不同的响应。

以前介绍的函数重载处理的是同一层次上的同名问题,而虚函数处理的是不同派生层次上的问题,前者是横向重载,后者可以理解为纵向重载。

2.在什么情况下应当声明虚函数

所以虚函数时,有两点要注意:
1.只能用virtual声明类的成员函数,而不能将类外的普通函数声明为虚函数。
2.一个函数被声明为虚函数后,不能再作为非虚函数。.
在什么情况下应当声明虚函数:
1.成员函数在类的继承后,功能可能改变,则声明为虚函数。
2.考虑对成员函数的调用时通过对象名,还是通过指针或者引用,如果时通过指针或者引用,则声明为虚函数。
3.有时,在定义虚函数时,并不定义其函数体,即函数体是空的。它的作用只是定义了一个虚函数,具体功能留给派生类添加。

3.虚析构函数

我们知道当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构函数。但是,如果1.用new运算符建立了临时对象,2.若基类中有析构函数,并且3.定义了指向该基类的指针变量。再程序用带指针参数的delete运算符撤销对象时,会发生一个情况:系统自会调用基类的构造函数,而不执行派生类的析构函数。

point *p=new cicle;
delete p;
//不会调用派生类的析构,只会调用基类的析构函数。

如果希望能执行circle的析构函数,可以i将基类的析构函数声明为虚析构函数。
注意:
1.如果将基类的析构函数声明为虚构函数时,由该基类所派生的所以派生类的析构函数也都自动称为虚函数,即使派生类的析构函数与基类的析构函数不同名。
2.构造函数不能说明为虚构函数。因为再执行构造函数时类对象还没有完成建立过程,当然谈不上函数与类对象的绑定。

三、纯虚函数与抽象类

1.纯虚函数
纯虚函数的一般形式:
virtual 函数类型 函数名(参数列表)=0;
注意:
(1).纯虚函数没有函数体
(2).最后面的’=0‘并不表示函数返回值为0,它只其形式上的作用,告诉编译系统这是纯虚函数
(3).这是一个声明语句,最后因该有分号。
(4)如果一个类中有纯虚函数,而在其派生类中没有对该函数的定义,则纯虚函数在派生类中仍然为纯虚函数。
2.抽象类
含有纯虚函数的类被称为抽象类。
抽象类不能用来定义对象,定义这些类的唯一目的就是用它作为基类去建立派生类。
如果在派生类中对基类的所以纯虚函数进行了定义,那么这些函数就被赋予了功能,可以被调用。这个派生类就不是抽象类,而是可以用来定义对象的具体类,如果而在其派生类中没有对该函数的定义,则派生类仍然是抽象类,不能用来定义对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@菜鸟一枚

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值