对象模型 关于对象(Object Lessons)
《深度探索C++对象模型》
对象成员布局
C++对象模型(The C++ object model)
简单对象模型
class Point {
public:
Point(float xval);
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream& print(ostream &os) const;
float _x;
static int _point_count;
};
Point实例的内存布局如下:
继承
单一继承: class Book : public Library_entry { ... };
多重继承: class iostream : public istream, public ostream { ... };
虚拟继承, 虚继承的类不管被派生多少次, 永远只会有一个实体subobject
class istream : virtual public ios { ... };
class ostream : virtual public ios { ... };
编译器展开(一种可能)
new = malloc + ctor
ctor = 构造函数 + vptr
虚成员函数: 跳转到 p->vptr[n] 执行
非虚成员函数: 直接跳转到对应 func 执行
关键词差异(A keyword distinction)
组合composition的struct(继承时编译器可能添加额外的data member到base struct subobject中), 拥有与C兼容的空间布局.
对象差异(An object distinction)
C++程序设计支持3中设计典范(programming paradigms):
- 过程式procedureal model: C
- 抽象数据类型abstract data type, ADT: 由“抽象”和一组表达式(public接口)一起提供
- 面向对象object-orientated: 通过一个抽象的base class封装起来
内存布局
class ZooAnimal {
public:
ZooAnimal();
virtual ~ZooAnimal();
// ...
virtual void rotate();
protected:
int loc;
string name;
};
ZooAnimal za("Zoey");
ZooAnimal *pza = &za;
- 多态
class Bear : public ZooAnimal {
public:
Bear();
virtual ~Bear();
// ...
virtual void rotate();
protected:
enum Dances { ... };
Dances dance;
int block;
};
Bear b("Yogi");
Bear *pb = &b;
Bear &rb = *pb;
本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://ziqia.github.io/2020/01/28/InsideCPPObject-1-object_model.html。学识粗浅写作仓促,如有错误辛苦评论或 邮件 指出。