4 多态的原理
4.1 虚函数表指针
我们以一道题来引入多态的原理。
下面编译为 32 位程序的运行结果是什么() A、编译报错 B、运行报错 C、8 D、12
class Base {
public:
virtual void Func1() { cout << "Func1()" << endl; }
protected:
int _b = 1;
char _ch = 'x';
};
int main() {
Base b;
cout << sizeof(b) << endl;
return 0;
}
按照我们之前的知识,这题答案应该选:C。但我们不妨多留一个心眼:这题如果是考察内存对齐,为什么要加一个虚函数呢?是不是没有这么简单。
我们来看下运行结果:为什么?Base 类中除了 _b 和 _ch 成员,还多一个 _vfptr 成员放在对象的前面(注意有些平台可能会放到对象的最后面,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v 代表 virtual,f 代表 function)。一个含有虚函数的类中至少都有一个虚函数表指针,因为一个类所有虚函数的地址要被放到这个类对象的虚函数表中,虚函数表也简称虚表。
class Base {
public:
virtual void Func1() { cout << "Func1()" << endl; }
virtual void Func2() { cout << "Func2()" << endl; }
void Func3() { cout << "Func3()" << endl; }
protected:
_b = ;
_ch = ;
};


