联编
将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。在编译过程中进行联编被称为“静态联编”,在程序运行时进行联编称为“动态联编”。
c++ 对非虚方法使用静态联编,对虚方法使用动态联编。
虚函数的工作原理
调用虚函数时,程序将查看存储在对象中的 vtbl 地址,然后转向相应的函数地址表。
虚函数对内存和运行速度的影响
使用虚函数,在内存和执行速度方面有一定的成本,包括:
- 每个对象都将增大,增大量为存储地址的空间;
- 对于每个类,编译器都将创建一个虚函数地址表(数组);
- 对于每个函数调用,都需要执行一项额外的操作,即到表中查找地址。
注意
-
构造函数不能是虚函数,派生类不继承基类的构造函数,所以将构造函数声明为虚的没什么意义。
-
析构函数应当是虚函数,除非类不用做基类。
- 友元不能是虚函数,因为友元不是类成员!只有成员才能是虚函数。
纯虚函数
纯虚函数提供未实现的函数,声明的结尾处为=0
,如
1 | virtual double Area() const = 0; |
或
1 | double Move(int nx, ny) = 0; |
类中包含纯虚函数时,不能创建该类的对象!包含纯虚函数的类只用作基类。要成为真正的抽象基类(ABC),必须至少包含一个纯虚函数。