1.带有虚函数的基类对象模型
我们先看段代码:
#include<iostream>
using namespace std;
class B1
{
public:
void func1()
{
}
int _b;
};
class B2
{
public:
virtual void func()
{
}
int _b;
};
int main()
{
cout<<"sizeof(B1) = "<<sizeof(B1)<<endl;
cout<<"sizeof(B2) = "<<sizeof(B2)<<endl;
system("pause");
return 0;
}
运行结果:
可以看出,B2的这个类比B1多了4个字节,而这4个字节就是用来存放虚函数的地址,也就是说,这4个字节的数据是一个指针(地址),这个指针指向的是虚函数地址。看个图就很容易理解。
我们需要注意的是:
1.B2对象的前4个字节存放的是虚表的地址,其后才是B2该对象的成员变量;(虚函数表我们也叫做虚表)。
2.若B2这个类中有多个虚函数,那么其对象大小还是8,因为前4个字节是存放虚函数表的地址,在这个虚函数表(函数指针数组)里面每个元素才是每个虚函数的地址。
2.派生类对象虚函数表如何构建?
上个例子,只是给出了带有虚函数基类的对象模型,那派生类的对象虚函数表应该如何构建?
#include<iostream>
#include<string>
using namespace std;
class Base //基类
{
public:
virtual void TestFunc1()
{
cout << "Base::TestFunc1()" << endl;
}
virtual void TestFunc2()
{
cout << "Base::TestFunc2()" << endl;
}
virtual void TestFunc3()
{
cout << "Base::TestFunc3()" << endl;
}
int _b;
};
class Derived : public Base //派生类
{
public:
virtual void TestFunc4()
{
cout << "Derived::TestFunc4()" << endl;
}
virtual void TestFunc1()
{