2018/9/20 15:01:09

1.虚函数表实现了C++的多态,解决了继承、覆盖、添加虚函数的问题。(只有在有覆盖的情况下,讨论才会更有价值)

2.虚函数表保存的是一个类中所有虚函数的地址,非虚函数的地址不在这张表上。在使用父类的指针来操作一个子类的时候,就根据虚函数表来确定调用哪个函数。

3.虚函数表是一个指针数组,每个元素对应一个虚函数的指针。在编译阶段就构建出了虚函数表。

4.虚函数表示属于类的,不是属于某个对象,一个类只有一个虚函数表。同一个类的所有对象都使用一个虚函数表。类的每一个对象都有一个指向虚函数表的指针vptr,当创建一个类的对象的时候,就创建了这个虚函数表指针,并且将这个指针指向类的虚函数表。

5.在虚函数被覆盖的情况下,虚函数表的具体变化如下:

(1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。

(2)在多重继承中,子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)

(3)在多重继承中,父类虚函数表中的f()的位置被替换成了子类的函数指针(所有的f()都被替换)。这样,我们就可以任一静态类型的父类来指向子类,并调用子类的f()了。

【思考】

1.父类和子类的虚函数表是同一个,还是不同的两个?

2.在多重继承中,提高了第一个父类的表,那是说子类自己没有虚函数表吗?