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

贵州建网站的公司wordpress编辑器格式

贵州建网站的公司,wordpress编辑器格式,无锡网站制作排名,棋牌推广方法目录 一. 多态 多态是什么 二. 多态的构成条件 1. 虚函数 2. 虚函数重写#xff08;隐藏#xff09; 3. 父类型的引用或者指针调用 4. 多态的特殊情况 1) 子类可以不加 virtual 关键字 2) 协变 三. 关键字 1. virtual 2. final 3. override 四. 多态的原理 1. 虚…目录 一. 多态 多态是什么 二. 多态的构成条件 1. 虚函数 2. 虚函数重写隐藏 3. 父类型的引用或者指针调用 4. 多态的特殊情况 1) 子类可以不加 virtual 关键字 2) 协变 三. 关键字 1.  virtual  2. final 3. override 四. 多态的原理 1. 虚函数表指针 2. 调用原理 多态是怎么样被调用的 多态为什么不能是父类的对象调用 为什么需要是虚函数呢 五. 总结 一. 多态 多态是什么 多态简单的说就是不同类型的对象调用相同的函数产生的结果是不同的。 二. 多态的构成条件 虚函数重写 父类型的指针或者引用调用虚函数 1. 虚函数 虚函数就是一个函数前面加一个关键字 virtual 关键字这样就是虚函数了但是虚函数只能是成员函数才能是虚函数而全局函数不可以成为虚函数。 virtual void fun() {cout fun() endl; }int main() {return 0; } 只有成员函数才可以是虚函数。 class A { public:virtual void fun(){} }; 这样就是没有问题的。 2. 虚函数重写隐藏 我们的父类和子类只有函数三同才可以构成虚函数重写。 三同函数名相同参数相同返回值相同然后还需要是虚函数。 只有满足三同并且还都是虚函数才能构成重写。 class person { public:virtual void buyTicket(){cout void person::buyTicket() endl;} };class student : public person { public:virtual void buyTicket(){cout void student::buyTicket() endl;} }; 上面代码就是一个重写。 3. 父类型的引用或者指针调用 void fun(person p) {p.buyTicket(); }int main() {person p;student s;fun(p);fun(s);return 0; } 上面就是多态了。 如果我们破坏了里面的任意一个条件那么就是不构成多态的我们下面破坏掉虚函数的条件让父类不是虚函数。 class person { public:void buyTicket(){cout void person::buyTicket() endl;} };class student : public person { public:virtual void buyTicket(){cout void student::buyTicket() endl;} };void fun(person p) {p.buyTicket(); }int main() {person p;student s;fun(p);fun(s);return 0; } 此时我们的调用就是普通的 person对象 调用 buyTicket 函数。 我们在破坏一个其他的条件返回值。 class student : public person { public:virtual void buyTicket(){cout void student::buyTicket() endl;} };void fun(person p) {p.buyTicket(); } 此时编译都不通过。 我们在破坏一个参数的条件。 class person { public:virtual void buyTicket(int a){cout void person::buyTicket() endl;} };class student : public person { public:virtual void buyTicket(){cout void student::buyTicket() endl;} }; 此时编译也是不通过的如果改变的是子类的参数那么编译通过但是调用时不成功的。 4. 多态的特殊情况 在多态里面是由一些特殊情况的 1) 子类可以不加 virtual 关键字 class person { public:virtual void buyTicket(){cout void person::buyTicket() endl;} };class student : public person { public:void buyTicket(){cout void student::buyTicket() endl;} }; 我们的多态也是成功的所以在多态这里我们的子类时可以不加 virtual 关键字的但是基类时需要加的。 2) 协变 协变就是参数可以不同但是我们是有条件的我们的协变只能是返回父类和子类的指针或者是引用。 class person { public:virtual person buyTicket(){cout void person::buyTicket() endl;} };class student : public person { public:virtual student buyTicket(){cout void student::buyTicket() endl;} }; 而且我们必选是同时是指针或者是引用我们也不仅是可以是自己的父类和子类我们也可以是其他的父类和子类。 class A {};class B : public A {};class person { public:virtual A buyTicket(){cout void person::buyTicket() endl;} };class student : public person { public:virtual B buyTicket(){cout void student::buyTicket() endl;} }; 而我们的返回值必须是父类返回父类子类返回子类。 class person { public:virtual B buyTicket(){cout void person::buyTicket() endl;} };class student : public person { public:virtual A buyTicket(){cout void student::buyTicket() endl;} }; 三. 关键字 1.  virtual  virtual 关键字 虚继承在继承的时候使用该关键字虚函数在函数前面加 virtual 关键字 2. final final 关键字 最终类在类的后面加 final 表示该类无法被继承 class A final {};class B : public A {}; 这里就是我们不能对 A 进行继承 3. override override 关键字 检查是否完成重写在派生类中使用加在想要被重写的函数后面静态检查在编译时静态检查确保派生类中重写了基类的虚函数 class A { public:void fun(){} };class B : public A { public:void fun() override{} }; 许哦一这里只需要完成重写就可以了。 class A { public:virtual void fun(){} };class B : public A { public:void fun() override{} }; 四. 多态的原理 1. 虚函数表指针 在前面的菱形虚拟继承继承中如果有重定义的函数或者变量那么里面是有一个虚基表的这个是虚函数表指针不要弄混了下面看一下虚函数表指针。 在有虚函数的类中该类都会有一个虚函数表指针该指针就是指向该类中的虚函数的。 class A { public:virtual void fun(){}int _a; };int main() {A a;cout sizeof(A) endl;return 0; } 这里的 sizeof 是8所以这里的 A 肯定不只有一个 _a 的成员变量还有一个虚函数表指针这个是一个指针所以在 32 位和 64 位下的环境是不同的。 下面1看一下该类的内部是怎么样的。 看一下这个指针里面的内容。 现在 a 这个对象里面只有一个虚函数所以该表里面只存储一个而虚函数表指针的本质就可以理解为一个函数指针数组该函数指针数组里面存储的就是一个个虚函数如果还有其他的虚函数那么还是会放在该类的这个虚函数表里面。 虚函数表每个类共同使用一个虚函数表。 下面看一下相同类型的对象使用的虚函数表是否相同。 2. 调用原理 多态是怎么样被调用的 多态是需要父类的对象或者是指针然后调用重写的虚函数。 在父类的指针或者引用看来它自己指向的对象模型就是一个父类对象。 class A { public:virtual void fun(){cout A::fun() endl;}int _a; };class B : public A { public:virtual void fun(){cout B::fun() endl;}int _b; };int main() {B b;return 0; }这里看一下B 类型对象的对象模型 所以在父类的引用或者指针看来就是一个父类的对象但是调用为什么会形成多态 看一下这个虚表指针里面的内容。 B 类型的对象里面的虚表指针里面是重写后的自己的虚函数所以在调用的时候可以调用到自己的函数。 那么为什么B 类型的对象里面的虚表指针里面是自己的函数地址呢下面分为3步。 在多态中派生类首先会把基类的虚函数表拷贝下来。如果派生类中对基类的虚函数进行了重写那么就会将虚函数表中的基类的被重写的虚函数替换成自己的虚函数的地址。如果自己也有自己的虚函数就将自己的虚函数添加到虚函数表中。 多态为什么不能是父类的对象调用 多态为什么不能是父类的对象呢 int main() {B b;A a b; } 现在将b 赋值给a那么现在的a里面的虚表是父类的虚表还是子类的虚表 当然是自己的因为在父子类在进行赋值的时候虚表是不会进行赋值的如果虚表进行赋值的话那么现在的 a 里面的虚表就是B 类型的虚表那么a 对象调用虚函数的时候是调用的就是派生类的函数了所以在进行赋值的时候虚表不能赋值由于虚表在赋值的时候不能不拷贝所以多态调用的时候不能是父类的对象。 int main() {B b;A a;b._a 10;a b; } 通过这段代码测试一下这里将里面的 _a 变量赋值时为例更好的查看。 这里看到虚表时没有变化的。 为什么需要是虚函数呢 前面说过了虚函数会放到虚表里面那么如果不是虚函数的话那么当然是不会放在虚表里面的所以如果函数都不在虚表里面即使是父类的指针或者是引用在虚表里面也找不到应该重写后的虚函数所以也就没法实现多态。 五. 总结 多态 多态的调用需要父类的引用或者是指针调用调用的函数必须是虚函数进行重写虚函数重写的条件是三同函数名相同返回值参数在多态这里子类是可以不加 virtual 的只要父类加了那么子类与父类的函数又是三同就构成多态协变协变就是返回值可以不同但是返回值必须是父类返回父类的指针或者是引用子类必须返回子类的指针或者是引用而且返回的父子类只要是父子类既可以不一定是自己的父子类
http://www.dnsts.com.cn/news/46234.html

相关文章:

  • 北京手机网站建设报价电子商务就是网络营销
  • 广东东莞自己建站教程西安企业名录电话资料
  • 苏州网站建设选苏州梦易行免费建网站无广告
  • 银行网站模板免费下载小熊源码网
  • 阜新建设网站谁给个网站啊急急急2021
  • 网站内容添加高级网站开发工程师工资
  • 网站的建设与运维网络营销是什么的一种市场营销方式
  • 网站收录了被人为删了怎么办wordpress更新文章收录
  • 企业网站推广的方法有在线代理免费
  • 网站引流推广软件镇江专业网站建设
  • 电子商务网站包括查建筑公司资质的网站
  • 企业网站制作开发有没有网站学做总结
  • 天津商务网站建设芜湖设计公司排名
  • 好的文化网站模板网站建设刂搜金手指下拉二四
  • 成都项目网站建设免费引流app下载
  • 网站建设公司的转型生活服务平台
  • 广东省建设厅网站查询envato wordpress toolkit
  • 哈尔滨有网站的公司龙岩建设局网站罗小波
  • 福州短视频seo方法优化网站排名公司
  • 浙江网站建设前十的公司去掉自动升级wordpress失败提示
  • 历下网站建设二级域名做网站域名
  • 沧州南皮手机网站建设做资源网站有哪些
  • 快递系统专注快递企业网站开发wordpress 整站 数据
  • 怎么做安居客网站外面网站怎么做
  • 广西网站建设开发团队微信公众号售卖
  • 大学生做网站o2o网站源码app
  • 网页首站软件生成器手机版
  • 哎呦视频在线资源观看网络优化工程师现状
  • 做网站需要学习哪些手机微信小程序开发教程
  • 哪个网站可以做中文云文字wordpress两个主题混合