1、虚函数 在成员函数前面加 virtual 后,该函数就称为虚函数,此时该类就会像虚继承一样多了一个虚表指针(虚函数表指针、虚指针) 2、虚函数表 虚表指针指向的是属于该类的一张表格的首地址,该表格中记录了该类中所有虚函数的首地址 如果类中没有其他成员变量 通过((void(*)(void))(**(int**)b))(); 可以直接通过虚函数表以及虚表指针来访问虚函数中第一个虚函数 void func(void) 3、覆盖(重写) 是构成多态的基础 当使用 virtual 修饰父类的成员函数时,此时父类中就会多一个虚表指针以及一张虚函数表,子类继承父类时会把父类的虚表指针以及虚函数表一起继承过来,然后编译器会去比较父子类中同名的虚成员函数的格式,如果格式完全相同的虚函数,就会把子类中虚函数表中原来同名父类虚函数的地址改为子类同名函数的地址,这时就称为覆盖 此时使用父类指针或引用指向子类对象时,调用虚函数则会去执行的是被覆盖后的虚函数表中所指向子类的同名且格式相同的成员函数,不再调用父类的同名虚函数 4、构成覆盖的条件 1、子类以public继承父类 2、父类中被覆盖的函数必须是虚函数 3、子类中必须有与父类虚函数同名的成员函数,且该函数的返回值、参数列表、常属性都必须相同 4、返回值类型相同,或者子类同名成员函数的返回值类型可以向父类虚函数的返回值类型做隐式转换,且有继承关系
标签:虚表,函数,子类,同名,C++,父类,重写,指针 From: https://www.cnblogs.com/ycddqr/p/17665613.html