您的位置:首页 > 其它

【笔试】虚函数和纯虚函数的区别

2015-04-17 17:28 134 查看

虚函数和纯虚函数的区别

虚函数和纯虚函数的区别
虚函数

纯虚函数

区别

1. 虚函数:

定义:简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。

作用:实现多态性(Polymorphism),多态性是将接口与实现进行分离;实现以共同的方法,但因个体差异,而采用不同的策略。

指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。

限制:

非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。

实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。

只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。

当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数。

如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现这种同名函数。

2. 纯虚函数

定义:纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

格式:

[code]class <类名>
{
virtual <类型> <函数名>(<参数表>) = 0;
};


凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。

3. 区别

虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。  

虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。

虚函数的定义形式:
virtual {method body};


纯虚函数的定义形式:
virtual { } = 0;


虚函数必须实现,如果不实现,编译器将报错,错误提示为:

对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。

如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。

包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: