虚函数表
//这里常考一道笔试题:sizeof(Base)是多少?
/*
这里 sizeof(Base) = 8。
int类型4个字节 + virtual中含一个指针:4个字节 = 8个字节
(无论有几个虚函数,只有一个指针,指针指向虚函数表)
*/
class Base
{
public:
//若不加virtual,则sizeof(Base) = 4,此时不计算函数大小
virtual void Func1()
{
cout << "Func1()" << endl;
}
private:
int _b = 1;
};
通过观察测试我们发现b对象是8bytes,除了_b成员,还多了一个_vfptr放在对象的前面(注意有些平台可能会放到对象的最后面,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v代表virtual,f代表function)。 一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表。
下面我们来分析一下派生类中这个表放了什么。
//针对上面的代码我们做出以下改造
//1、我们增加一个派生类Drive去继承Base
//2、Drive中重写Func1
//3、Base再增加一个虚函数Func2和一个普通函数Func3