虚函数应注意

链接:https://www.nowcoder.com/questionTerminal/e7caff49076745c2a607a71b9823fc87
来源:牛客网
 

在面向对象中,多态指的是使用相同的函数名来访问函数不同的实现方法,

即“一种接口,多种方法”,用相同的形式访问一组通用的运算,

每个运算可能对应的行为不同。C++语言支持编译时多态和运行时多态,

其中,编译时多态指的是系统在编译时能确定调用哪个函数,

它具有执行速度快的优点,运算符重载和函数重载就是编译时多态。

运行时多态指的是系统在运行时动态决定调用哪个函数,

它为系统提供了灵活和高度问题抽象的优点,通过继承和虚函数实现运行时多态。

运行时多态的基础是基类指针,基类指针可以指向任何派生类对象。

在基类中的某成员函数被声明为虚函数后,在之后的派生类中可以被重新定义。

但在定义时,其函数原型,包括返回类型、函数名、参数个数和参数类型的顺序,

都必须与基类中的原型完全相同。只要在基类中显式声明了虚函数,

那么在之后的派生类中就不需要用关键字virtual来显式声明了,可以略去,

因为系统会根据其是否和基类中虚函数原型完全相同来判断是不是虚函数。

所以,派生类中的虚函数如果不显式声明也还是虚函数。

对于虚函数,有几点内容需要引起读者注意:

1)因为虚函数使用的基础是赋值兼容

(赋值兼容是指在需要用到基类对象的任何地方都可以用公有派生类的对象来代替),

而赋值兼容成立的条件是派生类从基类public继承而来。所以,当使用虚函数时,

派生类必须是基类public派生的。

2)定义虚函数时,不一定要在最高层的类中,

而是看在需要动态多态性的几个层次中的最高层类中声明虚函数。

3)只有通过基类指针来访问虚函数才能实现运行时多态的特性。

4)一个虚函数无论被公有继承了多少次,它仍然是虚函数。

5)虚函数必须是所在类的成员函数,而不能是友元函数,也不能是静态成员函数。

因为虚函数调用要靠特定的对象类决定该激活哪一个函数。

6)内联(inline)函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的,

即使虚函数在类内部定义,编译时将其看作非内联。

7)构造函数不能是虚函数,但析构函数可以是虚函数。

在构造函数中需要初始化列表初始化的有如下三种情况 1.带有const修饰的类成员 ,如const int a ;

2.引用成员数据,如 int& p;

3.带有引用的类变量

猜你喜欢

转载自blog.csdn.net/wall_e12138/article/details/81178791