先看一段代码:
class
CAnimal
{
public:
CAnimal( )
{
age = 1;
num = 0;
}
CAnimal(int ag, int nu)
{
age = ag;
num = nu;
}
int age;
int num;
}
;
class
CDog:
public
CAnimal
{
public:
CDog( int age, int num, int kind ):
CAnimal(age, num)
{
this->kind = kind ;
}
int kind;
}
;
int
main( )
{
int a = 5;
CAnimal an(8, 9);
CDog dog(1, 2, 3);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return 0;
}
派生类CDog公有继承之CAnimal类,我们知道基类CAnimal有两个数据成员:age 和 num ,派生类CDog有一个新增成员:kind ,因此派生类实际上拥有的数据成员是:age num kind 。
CAnimal类有 age 和 num ,CDog 类也有 age 和 num ,那么CAnimal类和CDog类的这两个数据成员之间是什么关系呢?它们的内存地址一样吗?还是各有各地内存单元,互不影响?
就让我们来看看,它们在内存单元上的真实面貌:
VC6.0下的一种情况:
0x0012FF64:
0x0012FF68: 01 00 00 00-----------------------对象 age 的起始地址,dog.age 的地址
0x0012FF6C: 02 00 00 00-----------------------dog.num 的地址
0x0012FF70: 03 00 00 00-----------------------dog.kind 的地址
0x0012FF74: 09 00 00 00-----------------------对象 an 的起始地址, an.age的地址
0x0012FF78: 08 00 00 00-----------------------an.num 的地址
0x0012FF7C:05 00 00 00------------------------变量 a 的地址
从上面的内存结构来看,CAnimal类和CDog类的两个数据成员:age 和 num 在内存结构上是拥有独立的地址单元的,互不影响!!
如果CAnimal类中有保护成员和私有成员变量,这种类型的变量也会被继承到派生类中吗?也就是说派生类对象的内存模型中会有从基类继承来的保护成员和私有成员吗?
实际上基类的所有成员(不管是不是私有的)都会被继承到派生类中,只是这种情况下,派生类是无法访问到这些私有变量的!!
CAnimal类的对象模型:
an-------------> age
num
CDog类的对象模型:
dog-------------> age
num
kind
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
CAnimal类有 age 和 num ,CDog 类也有 age 和 num ,那么CAnimal类和CDog类的这两个数据成员之间是什么关系呢?它们的内存地址一样吗?还是各有各地内存单元,互不影响?
就让我们来看看,它们在内存单元上的真实面貌:
VC6.0下的一种情况:
0x0012FF64:
0x0012FF68: 01 00 00 00-----------------------对象 age 的起始地址,dog.age 的地址
0x0012FF6C: 02 00 00 00-----------------------dog.num 的地址
0x0012FF70: 03 00 00 00-----------------------dog.kind 的地址
0x0012FF74: 09 00 00 00-----------------------对象 an 的起始地址, an.age的地址
0x0012FF78: 08 00 00 00-----------------------an.num 的地址
0x0012FF7C:05 00 00 00------------------------变量 a 的地址
从上面的内存结构来看,CAnimal类和CDog类的两个数据成员:age 和 num 在内存结构上是拥有独立的地址单元的,互不影响!!
如果CAnimal类中有保护成员和私有成员变量,这种类型的变量也会被继承到派生类中吗?也就是说派生类对象的内存模型中会有从基类继承来的保护成员和私有成员吗?
实际上基类的所有成员(不管是不是私有的)都会被继承到派生类中,只是这种情况下,派生类是无法访问到这些私有变量的!!
CAnimal类的对象模型:
an-------------> age
num
CDog类的对象模型:
dog-------------> age
num
kind