C++虚函数

一、虚函数概述

虚函数应用于类的继承中。基类中定义的成员函数,如果在派生类中不做改变直接继承,则定义成非虚函数,如果需要在派生类中重载(override),则要定义成虚函数。

当我们使用指针或者引用调用虚函数时,该调用将会被动态绑定,即根据引用或指针所绑定的对象类型不同,该调用可能执行基类的版本,也有可能执行某个派生类的版本。

二、定义方式

在函数前边加上关键字 virtual ,virtual 只能用于类内部的成员函数的定义而不能用于类外部的函数定义,虚函数的解析发生在运行时而不是编译时。

1 class Quote
2 {
3 public :
4            std :: string isbn () const;
5            virual double net_price(std :: size_t n) const;// 虚函数
6 }

三、相关知识

1、派生类不一定非要重载基类的虚函数(primer P530),如果派生类没有继承基类中的某个虚函数,这个虚函数像其他普通函数一样,派生类直接继承基类中的版本。

2、虚函数在派生类中有三种声明方式:

      1)在函数声明后加上override关键字(推荐)

      2)在函数声明前加上 virtual 关键字

      3)什么也不加,某个函数一旦在基类中声明为虚函数,则在所有派生类中都是虚函数

基类与派生类的函数名、返回类型、形参列表必须完全一致。唯一例外是返回类型是类本身的指针或引用时。

3、动态绑定只有传入虚函数的参数为指针或者引用时才会发生,如果用普通类型调用虚函数,编译时便可确定其类型。

4、只有虚函数才能被重载。某个虚函数被声明为 final ,则不能再被重载。final加载声明最后。

5、回避虚函数机制。有时希望对虚函数的调用不进行动态绑定,而是执行虚函数的某个版本,这时用类作用域运算符  类名 ::

6、纯虚函数:在函数最后加上 =0  表示一个虚函数为纯虚函数,包含纯虚函数的类是抽象基类,抽象基类不能定义对象。也可以为纯虚函数提供定义不过不能在类内定义,只能在类外。

posted on 2019-07-16 11:18  史无前例小帅  阅读(130)  评论(0编辑  收藏  举报

导航