虚函数——C++PrimeCr第五版读书笔记

来源:互联网 发布:淘宝客新手怎么推广 编辑:程序博客网 时间:2024/04/28 14:13

派生类可以继承基类的成员,然而遇到与类型相关的操作时,派生类必须对其重新定义,换句话说,派生类需要对这些操作提供自己的新定义以覆盖(override)从基类继承而来的旧定义。这些成员函数在基类中通常定义为虚函数(virtual)。当我们使用指针或引用调用基函数 时,该调用将被动态绑定。根据引用或指针的绑定对象的类型不同,该调用可能执行基类的版本,也可能执行某个派生类的版本。

简略说明

class Base;//基类

class Derived;//派生类

Base ba;//定义一个基类对象

Derived de;//定义一个派生类对象

Base &b = ba;//b绑定基类对象

Base &d = de;//d绑定派生类对象

//vir()是基类中的一个虚函数,派生类中有重新定义

b.vir();//调用基类中的版本,由所指的对象决定。

d.vir();//调用派生类中的版本由所指的对象决定。

任何构造函数之外的非静态函数都可以是虚函数。基类通过在其成员函数的声明语句之前加上关键字virtual使得该函数执行动态绑定,关键字virtual只能出现在类内部的函数声明中,不能用于类外部的函数定义。如果基类中把一个函数定义为虚函数,则该函数在派生类中隐式地也为虚函数。

成员函数如果是非虚函数,则其解析过程发生在编译时而非运行时。动态绑定的是在运行才解析,才能知道执行的是哪一个函数版本。

派生类经常(但不总是)覆盖它的继承的虚函数。如果派生类没有覆盖其基类中的某个虚函数,则该虚函数的行为类似于其他普通成员,派生类会继承它在基类中的版本,派生类可以在它覆盖的函数前面使用virtual关键字,但并非要这么做。具体的做法可以在形参列表后,const成员函数的const关键字之后,或者引用成员函数的引用限定符后面添加一个关键字override。

override还有另一个作用。

派生类如果定义了一个函数与基类中的虚函数相同,但是形参列表不同,这仍然是合法的。编译器将认为这个函数与原有的函数是相互独立的。这时,派生类没有覆盖基类的版本。就实际编程习惯而言,这种声明往往容易发生错误,因为可能原本希望把基类中的函数覆盖掉,但一不小心把形参列表弄错了。

如果我们用关键字override标记了某个函数,如果该函数没有覆盖已存在的虚函数,编译器将报错。

同样,我们可以用关键字final标记某个函数,则之后任何尝试覆盖这个函数的操作都将引发错误。


0 0
原创粉丝点击