首页 理论教育C++程序设计教程:派生类对象的存储组织指南

C++程序设计教程:派生类对象的存储组织指南

【摘要】:派生类的对象不仅存放了在派生类中定义的非静态数据成员,而且也存放了从基类中继承下来的所有非静态数据成员,因而在派生类中存放的这些从基类继承下来的数据存储又称派生类对象的子对象。图6.8对象a和b的存储空间分配与非静态数据成员存储方式不同,基类与派生类的静态数据成员与成员函数是共享的。当派生类B对象使用从基类A继承下来的setvaluea和dispa成员函数时,编译系统会自动将这一调用映射到基类存放的代码。

在第2章中讨论过类对象的存储组织,每一个对象都占用一块存储空间,其中仅存放该对象的非静态数据成员,而静态数据成员以及成员函数则整个类才存放一份。

派生类的对象不仅存放了在派生类中定义的非静态数据成员,而且也存放了从基类中继承下来的所有非静态数据成员,因而在派生类中存放的这些从基类继承下来的数据存储又称派生类对象的子对象。

注意,即使基类中的私有数据成员不能继承到派生类中,但C++编译系统也为派生类对象分配基类中这些私有数据的存储空间。这种做法在大多数情况下并不会引起太大的内存占用问题。

例如,有以下程序:

上述程序中声明了一个类A,从该类派生出类B(属单继承的情况),这两个类中有一个同名的私有数据成员tag。程序的执行结果如下:

A:no=1,name=张三,tag=56

A:no=2,name=李四,tag=100

B:tag=200(www.chuimin.cn)

a:20

b:24

从结果看到,类A有3个私有数据成员,其对象a所占存储空间大小为18(sizeof(no)+sizeof(name)+sizeof(tag)),类B是从类A公有派生,尽管B∷tag与A∷tag重名,但A∷tag也占用类B对象的存储空间,所以类B对象b所占存储空间大小为22(=sizeof(A∷no)+sizeof(A∷name)+sizeof(A∷tag)+sizeof(B∷tag)),但由于A∷no,A∷name和A∷tag均为基类的私有成员,所以在类B中不能访问它们。

在main函数中,执行a.setvaluea(1,"张三",56);b.setvalueb(2,"李四",100,200);两个语句后,对象a和b的存储空间分配如图6.8所示。

图6.8 对象a和b的存储空间分配

与非静态数据成员存储方式不同,基类与派生类的静态数据成员与成员函数是共享的。在整个类层次中,基类A中定义的成员函数setvaluea和dispa以及派生类B中定义的成员函数setvalueb和dispb等都只保存一份代码。当派生类B对象使用从基类A继承下来的setvaluea和dispa成员函数时,编译系统会自动将这一调用映射到基类存放的代码。