C++之虚函数、纯虚函数、抽象类

之所以将C++中的虚函数、纯虚函数和抽象类写在一起,主要是为了便于比较。

首先,相信接触过c++的learner都会或多或少的听过多态这个词。那么问题来了,多态是怎么实现的呢?相信大家都知道是虚函数,下面,小云君就带大家一起来复习一下这个虚函数。

#include <iostream>

using namespace std;

class Base

{

public:

virtual void f()

{

cout<<"Base:: f()!!"<<endl;

};

};

class Derive : public Base

{

public:


virtual void f()//无论有无virtual,f都是虚函数

{

cout<<"Derive:: f()!!"<<end;

}

};


int main()

{

Base *pb = new Derive;

pb->f();//调用的是Derive的f函数


return 0;

}

这个程序的运行结果是: Derive:: f()!!   显然,这里就是多态的表现。

在Base中的f()函数前加上关键字virtual就是将函数f定义为虚函数, 并且 派生类Derive中覆盖了基类中的f()函数。在此中情况下,无论派生类中的同名方法前有没有加关键字virtual,它都是虚函数。而多态就是同样的消息被不同类型的对象接受时导致的不同行为,在这里基类的指针pb指向派生类对象,所以pb调用f()函数时,调用的是Derive中的虚函数。

若将析构函数声明为虚函数(我们通常称之为虚析构函数),则由其派生出子类的析构函数都是虚函数;

若基类中的虚函数带有默认参数,则派生类中重写基类的该方法时,默认的参数不要修改;

     其实纯虚函数和虚函数只是有一点细微的差别。

纯虚函数的声明如下:   

virtual  函数类型   函数名() = 0;

从声明中看得出,只是将虚函数的函数体换成“=0”就可以了。这仅仅是个声明,并且这个声明看起来是那么的奇怪,那么,纯虚函数的定义该怎么写呢?

回答这个问题之前,我们有必要了解一下抽象类。

抽象类就是含有纯虚函数的类。抽象类不能定义对象,即抽象类无法实例化,一般位于上层。既然抽象类无法实例化,那么抽象类中的函数的定义还有什么意义呢(无法通过对象去调用抽象类中的函数),所以抽象类中的函数一般不定义(当然也可以定义,一般没什么作用)。而在子类继承抽象类时,必须给出所有纯虚函数的定义部分,否则,这个子类也是抽象类,也无法实例化。

可以看出,C++中的抽象类有点类似于Java中的接口。

另外,如果大家不理解抽象这个词的话,可以去翻翻词典。还有,不得不说,当初的发明C++的人真是了不起,如果你有时间的话,不妨去《牛津/朗文词典》中去翻翻virtual这个词。


以上内容是小云君学习C++过程中的一些体会。毕竟能力有限,若有错误之处,还望批评指正:  singlecui@126.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值