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

电商网站设计模板dw绵阳网站建设哪家好

电商网站设计模板dw,绵阳网站建设哪家好,量品定制官网,长沙房地产网站设计#x1f496;作者#xff1a;小树苗渴望变成参天大树#x1f388; #x1f389;作者宣言#xff1a;认真写好每一篇博客#x1f4a4; #x1f38a;作者gitee:gitee✨ #x1f49e;作者专栏#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法#x1f384; 如 果 你 … 作者小树苗渴望变成参天大树 作者宣言认真写好每一篇博客 作者gitee:gitee✨ 作者专栏C语言,数据结构初阶,Linux,C 动态规划算法 如 果 你 喜 欢 作 者 的 文 章 就 给 作 者 点 点 关 注 吧 文章目录 前言一、多态的概念1.1 概念 二. 多态的定义及实现2.1多态的构成条件2.2 C11 override 和 final2.3 重载、覆盖(重写)、隐藏(重定义)的对比 三、抽象类3.1 概念3 .2 接口继承和实现继承 四、总结 前言 这篇我们开始讲解关于多态的语法细节C难学的第一个点在类和对象刚开始第二个点就是在继承和多态我们已经度过第一个点了接下来要迈进我们第二个难关大家要耐下心来进行学习博主也会梳理好逻辑方便大家学习话不多说我们开始学习多态。 本章重点 多态的概念多态的定义及实现抽象类 一、多态的概念 我们C是一个面向对象的语言我们通过类描述一个个的对象但是每个对象可能有多种状态多态是建立在继承的我们来看看多态的例子 1.1 概念 多态的概念通俗来说就是多种形态具体点就是去完成某个行为当不同的对象去完成时会产生出不同的状态。 第一个例子 比如买票这个行为当普通人买票时是全价买票学生买票时是半价买票军人买票时是优先买票 第二个例子 再举个栗子 最近为了争夺在线支付市场支付宝年底经常会做诱人的扫红包-支付-给奖励金的活动。那么大家想想为什么有人扫的红包又大又新鲜8块、10块…而有人扫的红包都是1毛5毛…。其实这背后也是一个多态行为。支付宝首先会分析你的账户数据比如你是新用户、比如你没有经常支付宝支付等等那么你需要被鼓励使用支付宝那么就你扫码金额 random()%99比如你经常使用支付宝支付或者支付宝账户中常年没钱那么就不需要太鼓励你 去使用支付宝那么就你扫码金额 random()%1总结一下同样是扫码动作不同的用户扫得到的不一样的红包这也是一种多态行为。ps支付宝红包问题纯属瞎编大家仅供娱乐。 通过这两个例子我们应该知道为什么要有多态是因为我们实现世界中有这种多种状态的情况 二. 多态的定义及实现 2.1多态的构成条件 多态是在不同继承关系的类对象去调用同一函数产生了不同的行为。比如Student继承了Person。Person对象买票全价Student对象买票半价。 class Person { public:virtual void BuyTicket() { cout 买票-全价 endl; } }; class Student : public Person { public:virtual void BuyTicket() { cout 买票-半价 endl; } }; void Func(Person p) {p.BuyTicket(); } int main() {Person p;Student s;Func(p);Func(s);return 0; }这里引入一个概念虚函数 虚函数即被virtual修饰的类成员函数称为虚函数。 并且静态的函数不能当成虚函数虚函数不能定义和声明分离只要普通函数可以当成虚函数去使用 通过这个例子相信大家应该知道多态的基本用法了我们来看看构成多态的基本条件 必须通过基类的指针或者引用调用虚函数通过对象去调用时不行的讲底层的时候在进行介绍 被调用的函数必须是虚函数且派生类必须对基类的虚函数进行重写 基类的的函数必须加virtual,变成虚函数子类必须重写基类的虚函数 虚函数重写的细节 派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的 返回值类型、函数名字、参数列表完全相同即类型相同就行)称子类的虚函数重写了基类的虚函数。 子类的重写虚函数前面可以不用加virtual但是建议加上后面会介绍这个可能为析构函数为产生的 虚函数重写的两种例外 协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时与基类虚函数返回值类型不同。即基类虚函数返回必须任意基类对象的指针或者引用派生类虚函数返回必须任意派生类对象的指针或者引用时称为协变。了解引用我就不演示了效果是一样的。 析构函数的重写(基类与派生类析构函数的名字不同) 在讲解这个例外之前在补充一个知识点实现多态后多态的调用看的是指向的对象而不是看类型而普通对象的调用时是看当前调用者的类型可以简单理解上面的多态通过指针或者引用去调用就是多态的调用使用对象去调用就是对象的调用想要达到通过指向的对象去调用就必须先形成多态才可以。(在讲解底层的时候会讲到也就是分析为什么多态需要的指针或者引用去调用而通过对象去调用不行) 有了上面的补充我们来看例子 class A { public:virtual ~A(){cout ~A() endl;} }; class B:public A { public:virtual ~B(){ cout ~B() endl;} }; int main() {A a;B b;return 0; }在继承的使用那一篇说到过我们析构函数都是先析构子在析构父那我们上面这个看着有点奇怪两个函数名不是一样的而且没有返回值这应该没有构成重写吧所以这是一个例外析构函数的重写可以没有返回值而且在编译的时候父子类的析构函数名都被统一处理为了destructor,所以函数名也是一样的,够成虚函数的重写 如果不是虚函数的重写会发生情况 我们看到运行结果一样的有的人就会说那是不是虚函数都是一样的那为什么要使他变成虚函数呢 原因是要适应下面的场景 我们发现它没有去调用B类的析构函数p没有进行释放造成内存泄漏了为什么会这样 我们的delete b实际上是两份构成b-destructor()operator delete 我们new B一个对象赋值给A*它去调用函数是普通对象的调用因为没有实现多态看调用者的类型为A*所以去调用了A类的析构函数就永远调不到B类的析构,我们只要使父类的析构函数是虚函数因为编译器本身会把所有类的析构函数统一处理成相同名字的函数只要父类函数是虚函数子类加不加virtual都构成虚函数的重写此时就构成多态了那么此时又是指针或者引用去调用那么指向哪个对象就去调用哪个的函数 所以通过这个例子也说明了多态调用和普通调用是不一样的等底层原理的时候会给大家一一解释的。也解决了析构函数可以是虚函数为什么要变成虚函数原因就是为了解决上面的出现的情况也解决了我上面说过为什么父类的virtual必须加而子类的不需要因为设计的时候析构函数就不用加也是防止写的人忘记加而导致的问题后面为了保持一致所以虚函数在重写的时候可加可不加。 所以我们在实现类继承或者多态的时候尽量都把基类的virtual给加上防止出错 2.2 C11 override 和 final 从上面可以看出C对函数重写的要求比较严格但是有些情况下由于疏忽可能会导致函数名字母次序写反而无法构成重载而这种错误在编译期间是不会报出的只有在程序运行时没有得到预期结果才来debug会得不偿失因此C11提供了override和final两个关键字可以帮助用户检测是否重写。 final修饰虚函数表示该虚函数不能再被重写 博主认为一个虚函数不能被重写那么它是虚函数的意义就没有了虚函数就是为了多态的多态就是需要虚函数的重写的所以final用到的也特别少反而下面这个关键字用到还是比较多的。 final还有一个用途 设计一个类不能被继承按照以往的案例 1我们可以将构造函数私有化 class A { private:A(){} };我们没有办法创建类对象了我们可以向外提供一个接口 class A { public: A createinit(){return A();} private:A(){} };就面临一个问题我们的createinit需要通过对象去调而这个函数就是为了创建对象的所以我们可以设置成静态的通过类名去调用 class A { public: static A createinit(){return A();} private:A(){} }; int main() {A::createinit();return 0; }2将析构函数私有化就调用不到析构函数了 3使用final进行修饰类 final必须放在后面。 override: 检查派生类虚函数是否重写了基类某个虚函数如果没有重写编译报错。 就是怕你想要fun是多态但是基类忘记写了代码少你可以一下子看出来代码多了就不好看了。 2.3 重载、覆盖(重写)、隐藏(重定义)的对比 覆盖是底层的说法重写是语法的说法 三、抽象类 3.1 概念 在虚函数的后面写上 0 则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类也叫接口类抽象类不能实例化出对象。派生类继承后也不能实例化出对象只有重写纯虚函数派生类才能实例化出对象。纯虚函数规范了派生类必须重写另外纯虚函数更体现出了接口继承。 class Car { public:virtual void Drive() 0; }; class Benz :public Car { public:virtual void Drive(){cout Benz-舒适 endl;} }; class BMW :public Car { public:virtual void Drive(){cout BMW-操控 endl;} }; void Test() {Car* pBenz new Benz;pBenz-Drive();Car* pBMW new BMW;pBMW-Drive(); }3 .2 接口继承和实现继承 普通函数的继承是一种实现继承派生类继承了基类函数可以使用函数继承的是函数的实现。虚函数的继承是一种接口继承派生类继承的是基类虚函数的接口目的是为了重写达成多态继承的是接口。所以如果不实现多态不要把函数定义成虚函数 抽象类是多态的一种约束你是抽象类就必须使用多态不然都实例化不出对象就一点用都没有 四、总结 说到这里我们多态的具体使用细节就到这里了说实话多态形成的条件还是特别多的那条件多就更来说明底层设计的更复杂需要很多条件才能适应它涉及的场景博主猜想先设计出来多态然后使用的时候发现需要这些条件才能满足才导致多态的语法细节比较多但是没事博主会给大家讲解明白的等我们学习了底层原理之后就会恍然大悟前面一会语法为什么要这样就解决了我们今天就到此为止我们下篇再见吧。。
http://www.sadfv.cn/news/416396/

相关文章:

  • 航达建设网站百度收录的网站多久更新一次
  • 河南网站制作公司托管平台
  • 台州黄岩网站建设搭建网站合同
  • 营销型网站建设教程视频教程优化网站公司哪家口碑好
  • 网站制作的步骤不包括教学单位 网站建设
  • 优化网站关键词排名软件嘉兴招聘网
  • 洛阳网站设计公司wordpress编辑器怎么变
  • 做网站全自动cpa引流yangdesign工业设计公司
  • 河南海绵城市建设网站大新网站制作
  • 仿腾讯网站源码在哪里可以建网站
  • 茂名网站建设服务表白网页代码
  • 贵州城乡建设厅城乡建设网站aso优化技巧
  • 大型服装网站建设正邦做网站吗
  • 中小型网站建设行情空间网络
  • 海外网站推广方法策划公司有哪些
  • wcm 可以做网站吗wordpress注册界面修改密码
  • 东莞物流网站设计公司汽油价格92号最新调整时间
  • 公司展示类网站模板免费下载哈尔滨大型网站制作
  • 无极网站网站网站怎么做的防采集
  • 网站建设动态站酷网素材图库免费下载
  • 长治市住房保障和城乡建设管理局网站下列关于网站开发中网页
  • 清华紫光做网站wordpress 简约模板
  • 网站建设shwzzz如何建设网站制作平台
  • 建设工程资质证书二维码扫描网站关键词排名推广方法
  • 专线可以做网站软件开发培训学校排名又简单又紧
  • 网站法人与负责人太原seo网络优化招聘网
  • 手机在网上怎么创建自己的网站世界杯32强排名
  • 微信引流神器手机电影网站怎么做施工企业安全总监职责履行情况
  • 广东建站常见网站开发的语言
  • 网页免费建站html动漫网页设计作品及代码