C++: 浅谈虚函数、纯虚函数

本文探讨C++中的虚函数和纯虚函数,解释它们在动态联编、抽象类以及泛型编程中的作用。通过示例说明如何使用纯虚函数为派生类提供接口,并阐述了基类指针指向派生类对象时的调用机制。
摘要由CSDN通过智能技术生成

C++: 浅谈虚函数、纯虚函数

标签: 虚函数 纯虚函数 抽象类


下面我将浅谈个人对虚函数、纯虚函数、抽象类的理解。

1.虚函数

要了解虚函数的作用,首先需要了解静态联编动态联编

静态联编:在编译时期将函数实现与函数调用连接起来的操作。
动态联编: 在程序运行时期将函数实现与函数调用连接起来的操作。

对于含有基类与派生类的源代码中,派生类对象调用与基类相同函数原型的函数时(注:函数原型是指函数头、函数名与返回类型),调用的是基类中该函数的实现。原因是:对于调用派生类中的与基类函数原型相同的函数,编译器默认将基类中该函数的实现与接口静态联编。这导致了基类无法正常调用自己的函数。因此为了解决这一问题,我们常常在基类的该函数的返回类型前加上virtual关键字来实现动态联编。virtual这一关键字的作用是告诉编译器要采用动态联编的方式,将函数接口与派生类中该函数的实现连接起来。

2.纯虚函数

在了解纯虚函数之前,我们先来了解一下抽象类的概念。

抽象类是指含有纯虚函数的类。抽象类不能实例化,这是它的一个重要特征。就如交通工具它可以作为一个抽象类,交通工具本身不能有实例化对象,因为交通工具包含飞机,火车,汽车,轮船等,而飞机,火车,汽车,轮船等可以分别写成一个普通类(除抽象类以外的类),继承交通工具这个抽象类。他们都有各自的实例化对象。

还有,我们需要了解指向基类的指针
我们知道,派生类对象可以赋值给基类对象,而基类对象不能赋值给派生类对象。派生类对象赋值给基类对象是将派生类对象中的基类子对象复制给基类的对象。

由此不难想到,基类的指针可以指向派生类,但是指针的只能访问派生类中的基类子对象的成员而无法访问派生类的成员。因此需要纯虚函数提供接口来解决这一问题。

一开始我认为既然纯虚函数在各个派生类中都要重新定义,那么何必在基类中定义纯虚函数呢,直接删了不就好了么?后来我发现,纯虚函数还是有作用的,他能提供派生类的函数接口,使得指针可以通过这些接口来调用派生类的成员函数。

也许有人会说,那么我就定义派生类指针来代替基类指针不就省事了么?其实,C++的一大特性就是泛型编程,如果一个类的派生类很多,那么你就要定义很多个派生类指针,而基类指针就只需要定义一个,显然节省了代码量,减少了许多不必要的麻烦。

接下来我要上一道例题:(Author: 陈雄涛)

We all know TA LSC is rich and he loves to traveling all over the world. There are three kinds of vehicles —— bicycle, train, and airplane to choose from. As a Tourist, he wants to know how long he should spend to travel from city to city when he chooses a vehicle strategy above.

BicycleStrategy, TrainStrategy and AirplaneStrategy iherits from Vehicle Class. void doTravel(…) function will print the time spent (refer to the sample output).
When choosing BicycleStrategy, the distance between two citys (x1, y1)、(x2, y2) is defined as Manhattan Distance: dis = |x1-x2|+|y1-y2|;
When choosing TrainStrategy, the distance between two citys (x1, y1)、(x2, y2) is defined as Euc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值