之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性。后来,发现它就是c++编译器给我们添加的vptr指针。
当类中声明虚函数时,编译器会在类中生成一个虚函数表;
虚函数表是一个存储成员函数指针的数据结构;
虚函数表是由编译器自动生成与维护的;
virtual成员函数会被编译器放入虚函数表中;
存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针)
在实现多态的过程中,父类和派生类都有vptr指针。
对象中的vptr指针什么时候被初始化:
对象在创建时,由编译器对vptr指针进行初始化;
只有当对象的构造完全结束后vptr的指向才最终决定下来;
父类对象的vptr指向父类的虚函数表,子类对象的vptr指向子类的虚函数表。
定义子类对象时,vptr先指向父类的虚函数表,在父类构造完成之后,子类的vptr才指向自己的虚函数表。(这也就是在父类或者子类的构造函数中调用虚成员函数不会实现多态的原因,这是一道面试题)