首页 > 代码库 > 编写高质量代码——在正确的场合下使用恰当的特性
编写高质量代码——在正确的场合下使用恰当的特性
虚函数:虚函数机制的实现是通过虚函数表和指向虚函数表的指针(存放在对象的空间中)来完成的。
1)空间方面:每个类只用一个虚函数表的拷贝,故其占用的空间不是很大。
2)时间方面:虚函数的调用开销包括两次整型加法和一次指针间接引用的开销。
其动态绑定的实现步骤如下:
(a)根据对象的虚指针VPtr找到该对象对应的虚函数表VTable,所需的开销仅是一次偏移量调整(整型加法)加上一次指针间接运算。
(b)在VTable中找到被调用函数的对应指针(整型加法)。
(c)调用(b)中得到的指针所指向的函数。
(a)和(b)的开销与(c)中的复杂调用开销(保存现场->传递参数->传递返回值->恢复现场)相比是微不足道的。
==============================================================
多重继承:对于多重继承,对象内部会有多个VPtr,所以会使偏移量计算变得复杂,而且会使对象占用的空间和运行时开销都变大。
class A{ ... };
class B{ ... };
class C : public A, public B{ ... };
如果A和B中都具有虚函数,那么C类对象会有三个VPtr指针,故需要更多的空间去存储这几个虚函数指针,同时函数偏移量的计算也要三选其一,计算变复杂。
==============================================================
虚基类:虚基类就是为多继承而产生的。对象中的指针更多。函数偏移量计算更复杂。
==============================================================
运行时类型检测(RTTI):在程序运行时得到对象和类相关信息的保证。
通常并不需要知道一个类的确切类型,因为C++提供的虚函数机制可以实现确定哪种类型的正确行为。但有时,确定一个匿名的多态指针指向对象的准确类型也是很有用的。
--------------------------------------------------------------
典型的RTTI是通过在VTable中放一个额外的指针来实现的。该指针指向一个专门用于描述该特定类型的type_info结构。每个类型仅有一份type_info结构的拷贝。
一般通过 typeid() 表达式获取对象的类型信息,typeid()带有一个参数,它可以是一个对象引用或指针,它返回一个type_info 类型的常量对象的引用。使用时,可以应用运算符"=="和"!="来比较这些对象,也可用name() 来获得该类型的名称。