c 类对象的内存模型计算机等级考试
文章作者 100test 发表时间 2009:07:07 23:25:28
来源 100Test.Com百考试题网
编辑特别推荐:
全国计算机等级考试(等考)指定教材
全国计算机等级考试学习视频
全国计算机等级考试网上辅导招生
全国计算机等级考试时间及科目预告
百考试题教育全国计算机等级考试在线测试平台
全国计算机等级考试资料下载
全国计算机等级考试论坛
C 类对象内存结构
首先介绍一下C 中有继承关系的类对象内存的布局:在C 中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。
对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指针和成员变量)。 之后是子类自己的成员变量数据。
对于子类的子类,也是同样的原理。但是无论继承了多少个子类,对象中始终只有一个虚函数表指针。
为了探讨C 类对象的内存布局,先来写几个类和函数
首先写一个基类:
classBase
{
public:
virtual void f() { cout <.<. "Base::f" <. virtual void g() { cout <.<. "Base::g" <.<. endl.}
virtual void h() { cout <.<. "Base::h" <.<. endl. }
intbase.
protected:
private:
}.
然后,我们多种不同的继承情况来研究子类的内存对象结构。
1.无虚函数集继承
//子类1,无虚函数重载
class Child1 : publicBase
{
public:
virtual void f1() { cout <.<. "Child1::f1" <. virtual void g1() { cout <.<. "Child1::g1" <.<. endl.}
virtual void h1() { cout <.<. "Child1::h1" <.<. endl. }
intchild1.
protected:
private:
}.
这个子类Child1没有继承任何一个基类的虚函数,因此它的虚函数表如下图:
我们可以看出,子类的虚函数表中,先存放基类的虚函数,在存放子类自己的虚函数。
2.有一个虚函数继承
//子类2,有1个虚函数重载
class Child2 : publicBase
{
public:
virtual void f() { cout <.<. "Child2::f" <. virtual void g2() { cout <.<. "Child2::g2" <.<. endl.}
virtual void h2() { cout <.<. "Child2::h2" <.<. endl. }
intchild2.
protected:
private:
}.