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 表示一个虚函数为纯虚函数,包含纯虚函数的类是抽象基类,抽象基类不能定义对象。也可以为纯虚函数提供定义不过不能在类内定义,只能在类外。