一切结论都必须以事实为依据,这样才能形成长久记忆!
虚表的形成过程:
①对于非继承类而言:编译器会根据类中是否有虚函数产生虚表,如果有虚函数,则会形成虚表,虚表中会按照成员函数声明顺序存放函数的地址,从而形成存放函数入口地址的函数指针数组,最后把数组地址存放在类的开始的位置,只一个指针的大小。
②对于继承类而言:对于单继承,如果父类中有虚函数表,则编译器编译时,会把父类的虚表赋值一份,并把其地址放在类的开始,只占一个指针大小的空间;对于多继承,编译器会把多个父类的虚表地址按照继承顺序依次从类的开始位置存放其虚表指针。
③对于继承时,如果其重写其父类的虚函数(注意重写与重载的区别),编译器会把新的函数的地址更新到原来虚函数对应的位置,如果该类新增虚函数是,编译器会默认把新的虚函数的地址存放第一个虚表中,追加在其后。
④虚函数就是指成员函数前加virtual 关键字的函数,但构造函数和友元函数(不是类成员函数)不会是虚函数,其他成员函数都可以使用virtual 修饰,当然纯虚函数也是虚函数。
⑤补充:在c++中纯虚函数与纯面向对象的语言,如java、C#,中的接口在功能上是一致的,都是起到接口规范的作用,知识在C++中纯虚函数在类中定义,所以导致在C++中,继承可以是多继承方式,而在纯面向对象中,只能是单继承。
对于以上的验证,大家可以参考http://blog.csdn.net/haoel/article/details/1948051
时间: 2024-11-08 07:41:23