今天讲讲C++中,虚函数与纯虚函数的用法和区别。
虚函数的提出在我上一篇关于C++的文章中已经提过(见),是为了解决多继承的二义性而提出的,今天不再赘述;
而纯虚函数是一种特殊的函数,它的作用是在基类中不给出有意义的实现,而把说明成纯虚函数,它的实现留给该基类的派生类去做。包含纯虚函数的类就是抽象类,抽象类不能被实例化,但是可以定义指向抽象类数据的指针变量,当派生类称为具体类后,就可以用这种指针指向派生类的对象,然后通过该指针调用虚函数,实现多态操作。
虚函数和纯虚函数的书写格式类似于下面:
class Student
{
virtual char * test(); //虚函数
virtual char * Category() =0; //纯虚函数
};
虚函数可以被直接调用,也可以备子类重载以后以多态的形式调用,而纯虚函数必须在子类中实现该函数才可以使用,因为纯虚函数在基类只有声明而没有定义。
虚函数和纯虚函数的定义中不能有static 标识符,原因很简单,被static修饰的函数在编译时候要求前期绑定,然而虚函数确实动态绑定,而且被两者修饰的函数生命周期也不一样。
如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类不能被直接调用,必须呗子类集成重载以后,根据要求调用其子类的方法。
class StudentA
{
public:
virtual void funOne() = 0; // 说明fun函数为纯虚函数
virtual void funTwo();
};
class StudentB
{
public:
virtual void funOne();
virtual void funTwo();
};
// CA,CB类的实现
...
void main()
{
StudentA xiaoliu; // 不允许,因为类CA中有纯虚函数
StudentB xiaoxin; // 可以,因为类CB中没有纯虚函数
...
}
本文简要介绍了虚函数和纯虚函数,并对它们做了简要区分。简单来说,虚函数是为了多重继承的二义性问题而提出的解决方案,纯虚函数的提出是使一些类的实例化更加符合逻辑,便于实现多态。