1、虚函数:即被virtual修饰的类成员函数(注意不是是普通成员)
2、虚函数的继承是一种接口继承,派生类继承的是基类的函数接口
3、注意区分这里virtual与菱形继承中的区别,菱形继承是为了去完成虚继承,解决数据冗余和二义行,而这里是可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一。(这里二者没有任何关联)
4、多态的两个条件①虚函数的重写②父类对象的指针或引用去调用虚函数,那么多态如何实现的指向谁就调用谁的虚函数的呢
首先,我们应该明白虚函数是怎么来的→通过虚表来了解一下。
class A {
public:
virtual void vfunc1();
virtual void vfunc2();
void func1();
void func2();
private:
int m_data1, m_data2;
};
从上图可知,虚表存的是虚函数的指针(虚函数不是存在于虚表)虚表是一个指针数组。
知识扩展:类对象 在创建的时候有*-vfptr的指针指向虚表,-vfptr就是虚表(对象的前四个字节的地址)
值得注意的是,在多继承中,派生类的未重写的虚函数放在第一个继承基类的部分虚表中
总而言之:多态在运行时到指定的对象的虚表中查找要调用的虚函数的地址来进行调用。