子类具备父类的所有成员数据和成员函数。在父类中声明为私有(private)的成员,虽然子类对象无法直接访问,但是在子类对象的内存结构中,父类私有的成员数据依然存在。C++语法规定的访问控制权限仅限于编译层面,由编译器进行语法检查。
子类对象在内存中的数据排列为:先安排父类的数据,后安排子类新定义的数据。内存结构等价于如下代码形式:
class CBase{...}; //父类定义代码略
class CDerive
{
public:
CBase m_Base; //原来的父类CBase成为成员对象
int m_nDerive; //原来的子类派生数据
}
1、如果子类没有构造函数或析构函数,而其父类却需要构造函数与析构函数时,编译器会为该父类的子类提供默认的构造函数与析构函数,从而调用成员对象(指等价代码中的CBase类对象)的构造函数。
2、如果子类含有构造函数,而父类不存在构造函数,则分两种情况:如果父类中没有虚函数,也不存在构造祖先类的问题,则编译器不会为父类提供默认的构造函数,因为没有意义;如果父类含有虚函数,此时父类需要初始化虚表工作,因此编译器会为其提供默认的构造函数,以初始化虚标指针。
未完待续
本文是对原著的总结,非我原创,详情求购买原著。