您的位置:首页 > 编程语言 > C语言/C++

深度探索c++对象模型-阅读笔记

2016-07-27 21:32 645 查看
深度探索c++对象模型-阅读笔记

第一章和第三章

1. class object model



class Point的内存分布



2. 虚函数指针vptr的设定和重置都是由class的constructor,destructor和copy assignment自动完成。

class Base;
class Drive:public Base;

Drive d;
Base b = d; //b的vptr不指向Drive的虚函数表


3.虚继承情况下,base class不管在继承链中派生多少次,都只会存在一个实体。

4.多继承情况下,有可能产生多个vptr。

5.虚继承情况下,派生类会多产生一个vptr。根据不同策略,可能指向虚基类共享部分或者指向虚基类表(书中第三章 3.4节 p123)

class Base
{
public:
virtual void func();
}
class Drive1:public virtual Base{};
class Drive2:public Base();

//win32下
sizeof(Drive1)大小为8字节
sizeof(Drive2)大小为4字节


6.指向data member的指针和指向data member选择的指针

class A
{
public:
int a;
};
//指向data member的指针
int A::*p1=&A::a;  //返回类内offset,按字节算
//指向int的指针
A obj;
int *p2=&obj.a; //返回内存中真实地址
//返回a
obj.a=100;
cout<<obj.a<<" "<<obj.*p1<<endl;


7.成员函数和非成员函数有相同的存取效率,是由于将成员函数经过mangling处理,转化为了非成员函数

8.每一个含有virtual函数的class有一个虚函数表,每一个实例或者对象有一个虚函数指针指向虚函数表。(书中第四章 4.1节 p157)

Point pt;
pt->func(); //func为virtual函数
//编译器调用形式:(*pt->vptr[2])();或者(pt->vptr[2])();其中vptr为虚函数指针,2为func在虚函数表的索引
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: