之所以将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