所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
关于虚函数表的说明
1、 只有存在虚函数的类才有虚函数表
2、 虚函数表是类拥有的,不是对象拥有的,对象拥有指向虚函数表的指针,相同类的所有对象的指针都是一样的。
3、 有些类可能有多个虚函数表,因为这些类从不同的基类继承了虚函数,这个时候类对象也需要有多个指针指向不同的虚函数表
4、 为了保证性能,对象会把虚函数表指针放在对象内存的前面。
5、 如果有多个虚函数表,子类的成员函数会放到第一个声明的基类的虚函数表里面。
虚函数表的缺点和总结
1、 虚函数表的开销有点大,每个类都需要有自己的虚函数表,可能不止一个,每个对象都要有指向这些虚函数表的指针。MFC就没有采用这种机制,因为MFC中会派生出很多个类,这样每个类都要维护这样的虚函数表,但是每个类的要重写虚函数却很少,这样虚函数表里面大部分的函数指针都是指向基类函数的,就会造成重复和浪费,因此它使用的是一组结构体的宏定义来实现消息映射实现的。按照函数名称查表,这种方案可以避免如上的问题;但是由于要比较名称,有时候要遍历所有的继承结构,时间效率性能不是很高。
2、 如果继承体系的基类的virtual成员不多,而且在派生类要重写的部分占了其中的大多数时候,用C++的虚函数机制是比较好的;但是如果继承体系的基类的virtual成员很多,或者是继承体系比较庞大的时候,而且派生类中需要重写的部分比较少,那就用名称查找表,这样效率会高一些,很多的GUI库都是这样的,比如MFC,QT。