说一说虚函数
[1]虚函数:就是在类的成员函数的前面加virtual关键字
[2]虚函数通过虚函数表(虚表)来实现,虚表中存的是虚函数指针
[3]虚函数和普通函数一样的,都是存在代码段的,只是他的指针又存到了虚表中
[4]类的对象中存的是虚表指针(_vfptr),通过这个指针调用虚函数
[5]虚函数的调用会被编译器转换为对虚函数表的访问
[6]vs下虚表存在数据段
[7]虚函数表本质是一个存虚函数指针的指针数组,这个数组最后面放了一个nullptr
class Base
{
public:
virtual void Func1()
{
cout<<"Base::Func1()"<<endl;
}
virtual void Func2()
{
cout<<"Base::Func2()"<<endl;
}
void Func3()
{
cout<<"Base::Func3()"<<endl;
}
private:
int _b=1;
};
class Derive::public Base
{
public:
virtual void Func1()
{
cout<<"Derive::Func1()"<<endl;
}
private:
int _d=2;
};
int main()
{
Base b;
Derive d;
return 0;
}
/*派生类对象d中也有一个虚表指针*/
/*基类b对象和派生类d对象虚表是不一样的,这里我们发现Func1完成了重写,所以d的虚表中存的是重写的Derive::Func1,所以虚函数的重写也叫作覆盖,
覆盖就是指虚表中虚函数的覆盖。重写是语法的叫法,覆盖是原理层的叫法。*/
/*派生类虚表的生成:1.先将基类中的虚表内容拷贝一份到派生类虚表中 2.若派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数
3.派生类自己新增加的虚函数按其在 派生类中的声明次序增加到派生类虚表的最后 */