C++多态
问题引入
求如下代码所占内存数
class B
{
public:
virtual void Func()
{
cout << "Func()" << endl;
}
private:
int _a = 1;
};
int main()
{
cout << sizeof(B) << endl; //8
}
我们发现,B类中所占的字节数为8,我们可以得到,_a变量占4个字节,还剩下4个字节。
可以看到,B类中除了_a变量,还有一个vfptr指针,里面存着一个虚函数表,虚函数表中有虚函数Func的地址如下图所示👇
相应的vfptr指针叫做虚函数表指针(虚表指针)
在多态体系下类对象模型计算方式
类对象大小分为两部分计算
第一部分:虚函数表指针无论有多少个虚函数,或者派生类又重新定义新的虚函数,只存在一个虚函数表指针
第二部分:计算类对象中变量的大小
虚函数表
- 虚函数表本质就是一个存放着虚函数指针的指针数组,数组的末尾由nullptr结尾。
-
- 虚函数表中只能存放虚函数指针,普通函数未存放在虚函数表中。
- 函数(无论虚函数还是普通函数)都存放在代码段,虚函数表中之存放着虚函数指针。
多态中访问方式
需要对象通过指针或者引用的方式来实现多态的访问
class B
{
public:
virtual void Func()
{
cout << "B::Func()" << endl;
}
};
class D : public B
{
public:
virtual void Func()
{
cout << "D::Func()" << endl;
}
};
int main()
{
B *pd = new D();
B *pb = new B();
pd->Func(); //通过指针的方式来访问
pb->Func();
}
通过引用的方式来调用派生类与基类中的虚函数。