虚函数

来源:互联网 发布:建筑cad软件 编辑:程序博客网 时间:2024/06/05 14:39
       在C++里,基类中的成员函数有两种,一种是希望派生类能够直接继承而不要改变的函数,另一类是希望派生类进行覆盖的函数(返回类型与函数名和参数都不变【1】),我们将后者在基类中定义为虚函数。在派生类中我们对于虚函数可以在其前面添加“virtual”关键字,但通常情况下我们是不加的,因为一旦某个函数被声明为虚函数,在所有的派生类中其都是虚函数。我们要求在覆盖虚函数的时候,返回类型、函数名和参数都保持不变,但如果用户在派生类中定义了一个与虚函数几乎一样但参数不同的函数,这在语法上来说是没有错误的,编译器不会报错,但通常从编程的意义角度来看,它往往是软件设计者的一个笔误,少写或者多写了一个参数,这种错误很难发现。为了避免这种笔误,我们在派生类的虚函数重载时,在函数后面添加一个关键字“override”,告诉编译器,老子这就是在覆盖虚函数,如果这时笔误少写/多写参数,编译器直接就报错。当然有的时候我们可能希望自此以后不允许我的派生类再覆盖我的虚函数,可以在虚函数指定为final.     另外一点就是“动态绑定”的问题,对于基类的引用或指针(对象不存在)调用虚函数时,具体调用那个版本会在编译时才确定下来。但对于默认实参,编译器总是会选择基类的默认实参,尽管可能是调用派生类的虚函数。

how to do: 1、virtual void f1() const;
2、(virtual) void f1() const override;
3、(virtual) void f1() const final;

notes:[1] 返回类型可以不同,当返回类型是基类(派生类)的指针或者引用时。
[2]当在派生类中的虚函数里调用基类的虚函数必须使用类作用域::否则会陷入无限循环调用的地步。

0 0
原创粉丝点击