2. 单一继承派生类对象内存结构
2.1 普通C++对象单一继承内存结构
class CObject { private: int mv1; long long mv2; char mv3;
public: int GetValue1() const; void SetValue1(int val); };
class CObjectA : public CObject { private: long long mv4; long long mv5;
public: long long GetValue4() const; void SetValue4(long long val); };
(1) 普通C++派生类对象内存结构中,仅包含父类和子类的成员变量。
(2) 成员变量在内存中按照先父类后子类的顺序逐个排列。
(3) 父类和子类对象指针,都指向该对象实例内存首地址。
2.2 带有虚函数的C++对象单一继承内存结构
class CObject2 { private: private: int mv1 {1}; long long mv2 {2}; char mv3 {3};
public: virtual ~CObject2();
virtual long long GetValue2() const;
virtual void SetValue2(long long val);
};
class CObject2A : public CObject2 { public: long mv4 {4}; long mv5 {5};
public: virtual long GetValue5() const { return mv5; } };
(1) 对象结构顶部多出一个虚表指针,指向CObject2A虚表的第三个字段。虚标指针后面,各个字段按照先父类后子类的顺序逐个排列。
(2) CObject2A的虚表结构是对CObject2虚表的扩展,并在内容上兼容CObject2虚表。
(3) CObject2A的虚表从第三个字段开始,依次是虚构函数指针(D1Ev和D0Ev),后面是各个要方法按照先弗雷后子类的顺序逐个排列。
(4) delete操作时,会调用D0Ev的虚构函数。D0Ev0首先调用D1Ev,然后释放当前内存。
(5) D1Ev除了执行CObject2A的析构逻辑外,还会调用基类CObject2的D1Ev析构方法,实现递归析构。