前一篇文章《C++类对象大小的计算(一)常规类大小计算》初步介绍类大小计算后,我们继续来讨论含有虚函数时类的大小。
以下内存测试环境为Win7+VS2012,操作系统为32位
五、包含虚函数的类
包含虚函数的类,对象生成时,会在类对象当中插入一个指针,这个指针称做虚函数表指针,简称虚表指针(vPtr)。该指针指向一个虚函数表(简称虚表),虚函数表中存储了虚函数的入口地址。基类当中有虚函数时,会产生该虚函数表;创建基类对象,对象中的vPtr会指向该表;调用虚函数时,是通过vPtr在此表当中寻找函数入口地址的。
当派生类继承含有虚函数的子类时,会复制一份虚函数表,派生类如果有与基类中虚函数同名的虚函数,会在虚函数表中覆盖原来基类的虚函数;如果虚函数不重名,只会在虚函数表中增加一个函数入口。这种机制实现了类的多态。
如下面的例子:
#include <iostream>
using namespace std;
class A {
public:
A(int x=0) {
cout<<"A"<<x<<endl;
}
void printA() {
cout<<"Hello A";
}
};
class B :public A{
public:
B(int x=0) {
cout<<"B"<<x<<endl;
}
virtual void printB() {
cout<<"Hello B";
}
};
class C : public B{
public:
C() {
cout<<"C"<<endl;
}
virtual void printC() {
cout<<"Hello C";
}
};
int main() {
A a;
B b;
C c;
cout<<"size of a:"<<sizeof(a)<<endl;
cout<<"size of b:"<<sizeof(b)<<endl;
cout<<"size of c:"<<sizeof(c)<<endl;
return 0;
}
VS类结构图:
运行结果为:
#include <iostream>
using namespace std;
class A {
public:
A(int x=0) {
cout<<"A"<<x<<endl;
}
virtual void printA() {
cout<<"Hello A";
}
};
class B {
public:
B(int x=0) {
cout<<"B"<<x<<endl;
}
virtual void printB() {
cout<<"Hello B";
}
};
class C : public B, public A{
public:
C() {
cout<<"C"<<endl;
}
void printC() {
cout<<"Hello C";
}
};
int main() {
A a;
B b;
C c;
cout<<"size of a:"<<sizeof(a)<<endl;
cout<<"size of b:"<<sizeof(b)<<endl;
cout<<"size of c:"<<sizeof(c)<<endl;
return 0;
}
2942




被折叠的 条评论
为什么被折叠?



