C++虚函数与多态性

C++虚函数与多态性

开发工具与关键技术:C++、VisualStudio
作者:何任贤
撰写时间:2019年06月01日

多态性(Polymorphism)是指一个名字,多种语义;或界面相同,多种实现,而重载函数是多态性的一种简单形式。
虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编,而联编是指一个程序模块、代码之间互相关联的过程,而静态联编,是程序的匹配、连接在编译阶段实现,也称为早期匹配,而重载函数就是静态联编的例子,而动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编,而switch 语句和 if 语句是动态联编的例子。
在一个类说明中重载,基类的成员函数在派生类重载。
有 3 种编译区分方法:
第一种就是根据参数特征进行区分,例如:tast(int,char)和tast(bool,int)不是同一个函数,编译器可以进行区分。
第二种则是利用“::”作用域运算符进行区分,例如:A::tast()和B::tast()这两个也不是同一个函数,虽然它们有可能是同样的原型和同样的定义,但是编译器编译时会把它们区分开来。
第三种则是根据类对象进行区分,例如:我声明两个类对象为A a和B b,我通过点运算符来调用函数tast(),a.tast()和b.tast()编译器也会区分开来,编译器会去类A找a.tast(),去类B找b.tast(),而不会报重定义错误。
被关键字virtual 修饰的成员函数称为虚函数,在实现运行时多态的关键首先是要说明虚函数,另外,必须用基类指针调用派生类的不同实现版本。
虚函数的重载特性:在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同。
如果仅仅返回类型不同,C++认为是错误重载,如果函数原型不同,仅函数名相同,丢失虚特性。
下面是例子:
#include
using namespace std;
class A
{
public:
virtual void tast() { cout << “A” << endl; }
};
class B:public A
{
public:
void tast() { cout << “B” << endl; }
};
class C :public B
{
public:
void tast() { cout << “C” << endl; }
};
void main()
{
A *a; B b; C c;
a = &b;
a->tast();
a = &c;
a->tast();
}
在这里插入图片描述

这是使用的虚函数的结果,我们可以通过基类指针指向不同的派生类对象来调用派生类的函数,从而达到多态性,其中虚函数可以没有多态性,但是多态性肯定有虚函数。如果不使用virtual修饰tast()函数,我们就不可以通过基类指针指向派生类对象来调用派生类的tast()函数。下面没有使用virtual修饰的结果。

在这里插入图片描述
这就是没有被virtual修饰的结果,那么从上面的代码和结果我们可以肯定的是虚特性具有传递性。
虚函数和多态性使成员函数根据调用对象的类型产生不同的动作,多态性特别适合于实现分层结构的软件系统,便于对问题抽象时,定义共性,实现定义区别。
简单来说多态性就让基类和派生类中的成员函数在有一定共性,但定义有不相同时,我们就需要多态性,例如:当基类中的成员函数是求多边形周长,派生类则是求三角形周长或求其他形状周长时,求周长就是它们的共性,而它们求周长的公式都不相同,这就是它们的不同定义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值