- 静态多态性:编译期间确定具体执行哪一项操作,主要是通过函数重载和运算符重载来实现的;
动态多态性:运行时确定具体执行哪一项操作,主要是通过虚函数来实现的。 - 如果类中含有虚函数,则编译器需要为类构建虚函数表,类中需要存储一个指针指向这个虚函数表的首地址,注意不管有几个虚函数,都只建立一张表,所有的虚函数地址都存在这张表里,类中只需要一个指针指向虚函数表首地址即可。
- 虚继承的作用是什么?
在多继承中,子类可能同时拥有多个父类,如果这些父类还有相同的父类(祖先类),那么在子类中就会有多份祖先类。例如,类B和类C都继承与类A,如果类D派生于B和C,那么类D中就会有两份A。为了防止在多继承中子类存在重复的父类情况,可以在父类继承时使用虚函数,即在类B和类C继承类A时使用virtual关键字,例如:
class B : virtual public A
class C : virtual public A
注:因为多继承会带来很多复杂问题,因此要慎用。 父类和子类定义了同名的函数就是函数的隐藏
子类继承父类的虚函数就是函数的覆盖
虚函数表占用4个字节内存
继承抽象类时,如果没有对纯虚函数重新定义,则子类也是抽象类
仅含有纯虚函数的类是接口类,没有数据成员,只有纯虚成员函数
静态联编与动态联编:如果是通过对象名调用虚函数,在编译期间就能确定调用的是哪一个类的虚函数,所以属于静态关联;如果是通过基类指针调用虚函数,在编译阶段无法从语句本身确定调用哪一个类的虚函数,只有在运行时,pt指向某一个类对象后,才能确定调用的是哪一个类的虚函数,故为动态关联
重载:只有在同一个类定义中的同名成员函数才存在重载关系,主要特点是函数的参数类型和数目有所不同,但不能出现函数参数的个数和类型均相同,重载和成员函数是否是虚函数无关
覆盖:在派生类中覆盖基类中的同名函数,要求两个函数的参数个数、参数类型、返回类型都相同,且基类函数必须是虚函数。
隐藏:派生类中的函数屏蔽了基类中的同名函数,两个函数参数相同,但基类函数不是虚函数(和覆盖的区别在于基类是否是虚函数)。两个函数参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽(和重载的区别在于两个函数不在同一个类中)。
构造函数不能是虚函数,析构函数可以是虚函数
以下哪些做法是不正确或者应极力避免的:A,C,D
A、构造函数声明为虚函数
B、派生关系中的基类析构函数声明为虚函数
C、构造函数中调用虚函数
D、析构函数中调用虚函数
虚函数必须是类的成员函数,其中类的静态成员函数和构造函数不能定义为虚函数,析构函数可以
使用对象名调用虚函数,是静态联编;
使用基类指针调用虚函数,是动态联编
C/C++错题集之虚函数相关
最新推荐文章于 2021-05-05 19:56:00 发布