虚函数和纯虚函数

虚函数和纯虚函数

在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念。因为它充分体现了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广。比如在微软的MFC类库中,你会发现很多函数都有virtual关键字,也就是说,它们都是虚函数。难怪有人甚至称虚函数是C++语言的精髓。

那么,什么是虚函数呢,我们先来看看微软的解释:

虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。

说的太官方。。。。。
再看下面的

定义一个函数为虚函数,不代表函数为不被实现的函数
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数
定义一个函数为纯虚函数,才代表函数没有被实现
定义他是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
有纯虚函数的类是不可能生成类对象的,如果没有纯虚函数则可以。比如:

class CA 
{ 
public: 
    virtual void fun() = 0; // 说明fun函数为纯虚函数 
    virtual void fun1(); 
}; 

class CB 
{ 
public: 
    virtual void fun(); 
    virtual void fun1(); 
}; 

// CA,CB类的实现 
... 

void main() 
{ 
    CA a; // 不允许,因为类CA中有纯虚函数 
    CB b; // 可以,因为类CB中没有纯虚函数
    ... 
} 

虚函数与重载的关系
在一个派生类中重新定义基类的虚函数是函数重载的另一种特殊形式,但它不同于一般的函数重载。 一般的函数重载,只要函数名相同即可,函数的返回类型及所带的参数可以不同。但当重载一个虚函数时,也就是说在派生类中重新定义此虚函数时,要求函数名、返回类型、参数个数、参数类型以及参数的顺序都与基类中的原型完全相同,不能有任何的不同。

虚函数的限制 如果我们将所有的成员函数都设置为虚函数,当然是很有益的。它除了会增加一些额外的资源开销,没有什么坏处。但设置虚函数须注意以下几点。 ①只有成员函数才能声明为虚函数。因为虚函数仅适用于有继承关系的类对象,所以普通函数不能声明为虚函数。 ②虚函数必须是非静态成员函数。这是因为静态成员函数不受限于某个对象。 ③内联函数不能声明为虚函数。因为内联函数不能在运行中动态确定其位置。 ④构造函数不能声明为虚函数。多态是指不同的对象对同一消息有不同的行为特性。虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此,虚构造函数是没有意义的。

纯虚函数
一个抽象类至少带有一个纯虚函数。纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的实现内容。纯虚函数的声明形式如下:
virtual <函数类型> <函数名> (参数表) = 0;
纯虚函数与一般虚函数在书写形式上的不同在于其后面加了“=0”,表明在基类中不用定义该函数,它的实现部分——函数体留给派生类去做。

最后加一句,就是,使用虚函数的一个原因就是可以改变程序的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值