多态在底层存放
首先我们得知道什么是多态?
是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。
先举一个例子
class Base//基类
{
public:
virtual void fun1()
{
cout << "fun1()" << endl;
}
virtual void fun2()
{
cout << "fun2()" << endl;
}
void fun3()
{
cout << "fun3()" << endl;
}
private:
int _b = 1;
};
class Derive : public Base //派生类
{
public:
virtual void fun1()
{
cout << "Derive()" << endl;
}
private:
int _d = 2;
};
int main()
{
Base b;
Derive d;
cout << "b:" << sizeof(b) << endl;//8字节
cout << "d:" << sizeof(d) << endl;//12字节
return 0;
}
在基类中定义了三个类的成员函数,其中有两个是虚函数(virtual+类成员函数)
下面我们来看基类定义的对象里面有什么
- 一个void**二级指针
- int类型数据_b
基类对象b大小为8字节很容易看出来
下面在内存中研究
取地址b,只需看前八个字节,前四个字节为指针,后四字节是_b的值
再看前四字节地址所对应的内容
发现前四字节对应的是fun1()的地址,紧跟的四字节是fun2()的地址,如何证明呢?
图1中0xec1082{Base::fun1(void)}可证。
同理在派生类中
在这里插入图片描述
然后总结一下