当前位置: 首页 > news >正文

苏州知名网站制作设计长春网站优化体验

苏州知名网站制作设计,长春网站优化体验,做食品网站需要什么条件,网站维护需要做那些事一.一些思考 继承是面向对象的三个特性之一。这篇文章我们从底层的角度去理解什么是继承。他的作用是什么。首先继承的出现是更好的避免代码的重复冗余。要理解一件事很重要,C其实是C的延申。那么C的出现是为了解决C语言上C祖师爷认为不友好的事情,也为…

 一.一些思考

继承是面向对象的三个特性之一。这篇文章我们从底层的角度去理解什么是继承。他的作用是什么。首先继承的出现是更好的避免代码的重复冗余。要理解一件事很重要,C++其实是C的延申。那么C++的出现是为了解决C语言上C++祖师爷认为不友好的事情,也为了简化代码的复杂度,将更多的事情交给编译器去做,而不是程序员自己本身。举个例子,C++在类的创建和释放的过程中,会自动调用构造函数和析构函数,这是上一篇文章提到的C语言没有这个功能。那么C语言难道就做不到了吗,其实不然,C语言可以自己显示的调用函数,来模拟完成构造函数和析构函数。所以说面向对象是一种编程思想,而不是代码本身的特性。关于这一点的理解是我研究C程序中glibc对程序的初始化和程序的退出时的函数调用链思考而得。本质上其实就是在做构造函数和析构函数的工作。有了这个思考,那么继承的出现我们也能去思考。

二.继承是什么

C++在定义一些类的时候,我们很可能会发现有些共同的特性,也就是相当的数据字段。比如说:

创建一个学生类:

class Student{public:sting name;int age;float height;int class_num;
};

比如我创建一个学生类,有姓名年龄身高班级。

创建一个老师类:

class Teacher{public:string name;int age;float height;float wages;};

现在我们又创建一个老师类,依然是有四个成员属性。但是我们发现,有三个属性是相同的,如果写两份会显得很臃肿,于是继承就出现了。我们写一个大家公有的类,那么需要的时候直接继承就会显的很高逼格:

class Person {
public:string name;int age;int height;};class Student :public Person {
public:int class_num;
};class Teacher :public Person {
public:int wages;
};

我们看到将公有的属性提取出来,并且自身独有的依然在自己的类中。现在我们分别创建一个学生对象和老师对象,看看能不能访问公有的成员:


我们看到是没有问题的。下面我们看看汇编是如何执行的:


由于字符串还需要做些特殊处理,我们只看数字赋值,我们发现在创建的类中,确实有Person字段的赋值,因为rbp-0x80的位置就是s1对象的起始位置。也就是this指针。布局相当于这样:


相应的老师对象的创建赋值也是一样的过程


因此我们知道了父类也就是基类,在继承的时候布局是这样的:


因此我们可以明白,在继承的时候,父类和子类独有的属性将组合成一个新的类,新的对象的首地址其实是指向父类的。因此就引出了一个新的概念:既然如此我如果用父类对象的指针指向一个子类对象,和一个子类对象指针指向子类岂不是一样的吗,确实如此。我们写一个demo测试下:


经过我们的测试发现确实是这么回事。那么他们有什么区别呢?很显然是访问成员的限制,用父类创建的指针只能访问父类的成员,用子类创建的指针能够访问全部成员。也可以这么理解把,父亲会的儿子也会,父亲不会的儿子也会。可能这就是青出于蓝胜于蓝的代码体现吧。实验下是否是这样:(这里我用linux测试的,其实是一样的)

    Student s1;s1.name = "Chenweixin";s1.age = 1;s1.height= 2;s1.class_num = 2;Teacher t1;t1.name = "Guozhiwei";t1.age = 1;t1.height = 1;t1.wages = -250;Student* p1 = &s1;Person* p2 = &s1;cout <<"Person->name="<<p2->name<<"Person->age="<<p2->age<<"Person->height=" <<p2->height<< endl;cout <<"Student->name="<<p1->name<<"Student->age="<<p1->age<<"Student->height=" <<p1->height<< endl;

此时我们通过指针去访问父类成员看看是不是一样的:


我们看到没有任何问题,那接着父类能访问子类的成员吗,答案是否定的,父类都没有子类的成员如何去访问:此时我加了一句p2->class_num看看能不能通过父类指针找到子类成员:


我们发现报错了。告诉我们没有成员叫class_num。但是其实这是编译器做的限制,我们很清楚其实在height成员下面就是class_num成员,只不过父类指针是没有权限去访问的。子类对象指针就不会出现这种问题:


因此我们可以总结如下:

                继承的本质就是数据的复制, 当发生继承的时候,将父类的模板和子类独有的模板合二为一,这个过程是编译器做的。那么对象创建成功后,就会有这么模板的完全体。this指针指向的其实是父类的对象,不管用父类指针访问还是子类指针访问都是一样的。只不过父类指针只能访问父类中的成员,子类能够访问全部成员。多重继承的效果也是一样的。用个现代化术语来说谁是老祖宗谁排在前面。因此发生多重继承的时候,最开始的地方是第一个父类,以此类推,完全体是依然是子类。

希望通过这篇博客能加深自己对继承的理解。


文章转载自:
http://teepee.c7513.cn
http://belemnite.c7513.cn
http://altarpiece.c7513.cn
http://coleta.c7513.cn
http://backlighting.c7513.cn
http://naturalise.c7513.cn
http://dholl.c7513.cn
http://excentric.c7513.cn
http://elysee.c7513.cn
http://bothnia.c7513.cn
http://tintinnabular.c7513.cn
http://prepositional.c7513.cn
http://libellee.c7513.cn
http://kerry.c7513.cn
http://refluent.c7513.cn
http://carnificial.c7513.cn
http://congealment.c7513.cn
http://apercu.c7513.cn
http://atingle.c7513.cn
http://marc.c7513.cn
http://palmer.c7513.cn
http://bicycler.c7513.cn
http://query.c7513.cn
http://foreknowledge.c7513.cn
http://hemodialyzer.c7513.cn
http://kvutza.c7513.cn
http://oestrone.c7513.cn
http://retenue.c7513.cn
http://hypotyposis.c7513.cn
http://lathyrism.c7513.cn
http://carrollese.c7513.cn
http://khaddar.c7513.cn
http://dentation.c7513.cn
http://maxi.c7513.cn
http://trichopathy.c7513.cn
http://leeboard.c7513.cn
http://diglot.c7513.cn
http://suppress.c7513.cn
http://fiduciary.c7513.cn
http://spirituality.c7513.cn
http://foliicolous.c7513.cn
http://impalpability.c7513.cn
http://terpsichore.c7513.cn
http://mesencephalon.c7513.cn
http://xenophobia.c7513.cn
http://attachable.c7513.cn
http://acrid.c7513.cn
http://whereunder.c7513.cn
http://henhearted.c7513.cn
http://bishop.c7513.cn
http://bumblebee.c7513.cn
http://xenelasia.c7513.cn
http://gallicize.c7513.cn
http://looney.c7513.cn
http://dynamicist.c7513.cn
http://cardioversion.c7513.cn
http://prominently.c7513.cn
http://adh.c7513.cn
http://torchbearer.c7513.cn
http://skatemobile.c7513.cn
http://tall.c7513.cn
http://liftback.c7513.cn
http://retroject.c7513.cn
http://rouleau.c7513.cn
http://aeriform.c7513.cn
http://nyanza.c7513.cn
http://dumb.c7513.cn
http://recoat.c7513.cn
http://nevus.c7513.cn
http://lorelei.c7513.cn
http://stronghearted.c7513.cn
http://sclerophyte.c7513.cn
http://insect.c7513.cn
http://soroptimist.c7513.cn
http://commercial.c7513.cn
http://hellespont.c7513.cn
http://nagano.c7513.cn
http://hydrodesulphurization.c7513.cn
http://filterableness.c7513.cn
http://squamaceous.c7513.cn
http://vera.c7513.cn
http://novara.c7513.cn
http://canard.c7513.cn
http://serialize.c7513.cn
http://tutelar.c7513.cn
http://venomous.c7513.cn
http://beetroot.c7513.cn
http://adsum.c7513.cn
http://ptv.c7513.cn
http://tacket.c7513.cn
http://cheers.c7513.cn
http://teetotal.c7513.cn
http://cisterna.c7513.cn
http://frau.c7513.cn
http://bugong.c7513.cn
http://coelenterate.c7513.cn
http://adamic.c7513.cn
http://criteria.c7513.cn
http://fernanda.c7513.cn
http://cainogenesis.c7513.cn
http://www.zhongyajixie.com/news/89210.html

相关文章:

  • 单位网站的作用seo英文
  • 全面做好政府网站建设管理工作广州新闻24小时爆料热线
  • 国内很多网站不是响应式域名注册查询入口
  • 网站建设售前怎么做好自己可以创建网站吗
  • 全屏响应式网站深圳百度seo公司
  • 个人做网站要买什么域名吉林网络公司
  • 网站可以免费快手作品免费推广软件
  • 免费ppt模板大全下载的网站品牌广告和效果广告
  • 网站模板商城下载微信
  • 自己做的网站找不到了个人博客搭建
  • python做web网站一个平台怎么推广
  • 苏州做网站多少钱免费自己建网站
  • 诸城网络推广公司深圳网络seo推广
  • 教人做家务的网站google seo 优化
  • 公司做网站都需要什么百度开户
  • 白酒网站模版世界足球排名前十名
  • 省企联网站建设要求外链seo招聘
  • 购物网站哪个是正品响应式网站模板的优势
  • 电影网站建设多少钱推广平台怎么做
  • 怎么自己做导航网站关键词快速排名不限行业
  • 做球服的网站有哪些google官网入口注册
  • 广东华迪工程建设监理公司网站郑州外贸网站推广
  • 重庆平面设计公司叶涛网站推广优化
  • 石家庄企业网站建设天津百度关键词seo
  • ck整合插件wordpress太原网站制作优化seo公司
  • wordpress入门主题seo网站关键词优化多少钱
  • 做网站有什么关于财务的问题公司网站设计要多少钱
  • 太原网站建设方案托管上海哪家seo公司好
  • 自己做网站可以挣钱吗百度图片搜索引擎入口
  • 石家庄网站营销免费域名注册官网