1.当你使用virtual虚函数的时候,对象中会自动生成vptr指针(指针指向虚函数表),并且形成虚函数表。 2.每次调用函数的时候,编译器会根据虚函数表中是否有此函数来判断是否执行多态,所以虚函数的效率比普通函数要低(要查表)。 3.vptr指针的存在证明
class A
{
public:
int geta()
{
return a
;
}
private:
int a
;
};
cout
<<sizeof(A
)<<endl
;
输出结果为
4;
class A
{
public:
virtual int geta()
{
return a
;
}
private:
int a
;
};
cout
<<sizeof(A
)<<endl
;
输出结果为
8;
因为构建虚函数后,类中加入了指向虚函数表的vptr指针,所以sizeof(A):4->8; 4.vptr指针分布初始化 若构造子类的时候利用了父类构造,vptr指针首先初始化在父类的虚函数列表,等父类构造完毕后,又初始化在子类中。