虽然有许多人对C++类对象表示怀疑,但在年复一年的不断发展中,他的使用率也在不断提高。如过要想对C++类对象充分了解,但前提是要深入理解到底什么是C++类对象,及他是怎么运作的。
成都创新互联公司专业为企业提供河源网站建设、河源做网站、河源网站设计、河源网站制作等企业网站建设、网页设计与制作、河源企业网站模板建站服务,十多年河源做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
首先介绍一下C++中有继承关系的类对象内存的布局:在C++中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。
对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指针和成员变量)。 之后是子类自己的成员变量数据。对于子类的子类,也是同样的原理。但是无论继承了多少个子类,对象中始终只有一个虚函数表指针。
为了探讨C++类对象的内存布局,先来写几个类和函数首先写一个基类:然后,我们多种不同的继承情况来研究子类的内存对象结构。
1. 无虚函数集继承
- //子类1,无虚函数重载
- class Child1 : public Base
- {
- public:
- virtual void f1() { cout << "Child1::f1" << endl; }
- virtual void g1() { cout << "Child1::g1" << endl; }
- virtual void h1() { cout << "Child1::h1" << endl; }
- int child1;
- protected:
- private:
- };
2. 有一个虚函数继承
- //子类1,无虚函数重载
- class Child1 : public Base
- {
- public:
- virtual void f1() { cout << "Child1::f1" << endl; }
- virtual void g1() { cout << "Child1::g1" << endl; }
- virtual void h1() { cout << "Child1::h1" << endl; }
- int child1;
- protected:
- private:
- };
虚拟继承的子类的内存结构,和普通继承完全不同。虚拟继承的子类,有单独的虚函数表, 另外也单独保存一份父类的虚函数表,两部分之间用一个四个字节的0x00000000来作为分界。
子类的内存中,首先是自己的虚函数表,然后是子类的数据成员,然后是0x0,之后就是父类的虚函数表,之后是父类的数据成员。如果子类没有自己的虚函数,那么子类就不会有虚函数表,但是子类数据和父类数据之间,还是需要0x0来间隔。
因此,在虚拟继承中,子C++类对象和父类的数据,是完全间隔的。存放子类自己的虚函数表和数据,中间以0x分界,最后保存父类的虚函数和数据。如果子类重载了父类的虚函数,那么则将子类内存中父类虚函数表的相应函数替换。
标题名称:透析C++类对象的内存模型
当前链接:http://www.shufengxianlan.com/qtweb/news14/53064.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联