VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 719|回复: 4

[原创] 派生类对象思考

[复制链接]
97_avatar_middle
在线会员 成都老沈骑游 发表于 2017-8-29 21:49:44 | 显示全部楼层 |阅读模式
假设有一个类:
class jilei
{
private:
         int ji;
public:
jilei()
{
        cout<<&ji<<endl;
                       
}

  void setjilei(int x)
  {   ji=x;
      cout<<ji<<endl;
            
  }
};
在主函数中我们有:
int main()
{
   jilei j1,j2;
   j1. setjilei(20);
   j2. setjilei(30);

}
对象j1,j2是类jilei的实例。j1,j2同属类jilei,共同特征是:相同的存储结构,相同的操作集合等等。
不同的特征有:不同的存储空间,不同的this值,不同的初始化操作等。
既然是该类的的一个实例,也就是说对象j1,j2属于类jilei,假如还有一个类:
class pai {
private:
         int pa;
public:
         pai()
         {
                 cout<<&pa<<endl;
      
          
      
         }
  
  void setpai(int p)
  {
    pa=p;
   

  }
};
J1,j2就不能访问类pai里的成员,因为对象J1,j2不属于类pai的。同样的有pai p1,p2; p1,p2也不能访问类jilei里的成员,因为对象p1,p2不属于类jilei的。
但是当我们把这两个类用一种继承关系来看,把类jilei作为基类,类pai是它的派生类,并公有继承,那么类pai的对象p1,p2就可以调用基类里的函数,间接访问基类里的数据成员了。
#include<iostream>
using namespace std;
#include<iostream>
using namespace std;
class jilei
{
  private:
         int ji;
  public:
jilei()
{
         ji=10;
         cout<<&ji<<endl;
         cout<<"调用基类构造函数"<<endl;
         cout<<this<<endl;
       
   
}
  void setjilei(int x)
  {
          ji=x;
          cout<<ji<<endl;
      cout<<this<<endl;

  }

  
};
class pai:public jilei
{
    private:
         int pa;
    public:
         pai()
         {
                  pa=10;

         cout<<&pa<<endl;
         cout<<"调用派生类构造函数"<<endl;
         cout<<this<<endl;
          
      
         }
void setpai(int x)
  {
          pa=x;
          cout<<pa<<endl;
      cout<<this<<endl;

}

};
int main()
{
    jilei j1;
        pai p1;
        p1.setjilei(50);
        p1.setpai(100);
cout<<"sizeof(jilei) is"<<sizeof(jilei)<<endl;

        cout<<"sizeof(pai) is"<<sizeof(pai)<<endl;
       
       
        return 0;
       
}
观察这个程序输出结果:
0012FF7C
调用基类构造函数
0012FF7C
0012FF74
调用基类构造函数
0012FF74
0012FF78
调用派生类构造函数
0012FF74
50
0012FF74
100
0012FF74
sizeof(jilei) is4
sizeof(pai) is8
Press any key to continue
在说明语句jilei j1;中,j1是基类jilei的对象,在内存里分配了4个字节的空间,首地址是0012FF7C
同时基类对象j1的this指针值是0012FF7C。
在说明语句pai p1;中,p1是派生类pai的对象,此对象包含着从基类jilei继承过来的数据成员和自己定义的数据成员:0012FF74(继承过来的数据成员的首地址),0012FF78(自己定义的数据成员的首地址),注意,这里的0012FF74是什么?现在要操作基类jilei内里的数据成员,有下列语句:
    p1.setjilei(50);
一般书讲,用派生类对象调用基类里的公有成员成员,但是,为啥可以呢?它的输出结果是:
     50
0012FF74
这里的0012FF74是this指针值,指向p1的,其实它是派生类对象所包含的基类对象的起始地址。这就是讲,派生类对象包含了基类对象,但是基类对象本身没有名字的,基类对象创造基类数据成员的空间,基类对象调用基类构造函数,对象具有this指针,显然,这里的p1.setjilei(50);中的this指针指向了派生类对象所包含的的基类对象。接下来的两语句cout<<"sizeof(jilei) is"<<sizeof(jilei)<<endl;和cout<<"sizeof(pai) is"<<sizeof(pai)<<endl;输出结果也表明:
  任何派生类对象都包含一个基类对象在其中,所以能用派生类对象访问基类里公有部分的成员,实际上是派生类中基类对象在访问。




上一篇:对象与this指针
下一篇:2017全球 C++ 及系统软件技术大会11月17日召开

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

81_avatar_middle
online_moderator Debug 发表于 2017-8-30 09:30:12 | 显示全部楼层
不错哦,分析的是那么回事儿派生类对象思考

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

97_avatar_middle
ico_lz  楼主| 成都老沈骑游 发表于 2017-8-31 11:10:35 | 显示全部楼层
要开学了,暂时c++告一段落,教的是英语课,高考压力太大了,备课,上课,改作,辅导。教书

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

28_avatar_middle
在线会员 Jordan 发表于 2017-9-9 14:27:29 | 显示全部楼层
赞一个派生类对象思考

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-13 08:47

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表