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

网站开发实训心得800北京高端网站建

网站开发实训心得800,北京高端网站建,开网页慢是什么原因,网络营销方法有哪些举例多态 什么是多态#xff1f;多态的定义及实现多态的构成条件虚函数虚函数的重写/覆盖关键技术原理最佳实践指南 虚函数重写协变析构函数的重写override和final关键字纯虚函数和抽象类 多态的原理多态是如何实现的 1. 虚函数表#xff08;vtable#xff09;虚函数表知识要点 … 多态 什么是多态多态的定义及实现多态的构成条件虚函数虚函数的重写/覆盖关键技术原理最佳实践指南 虚函数重写协变析构函数的重写override和final关键字纯虚函数和抽象类 多态的原理多态是如何实现的 1. 虚函数表vtable虚函数表知识要点 2. 虚函数的声明3. 多态的实现过程动态绑定与静态绑定 什么是多态 多态Polymorphism是面向对象编程的三大核心特性之一封装、继承、多态源于希腊语多种形态。在C中它允许我们使用统一的接口处理不同类型的对象显著提高了代码的灵活性和可扩展性。 核心概念 同一接口多种形态 不同的对象可以通过相同的方法名调用但实际执行的逻辑由对象自身的类决定。解耦调用与实现 调用者只需关注接口方法名和参数无需关心具体实现提高代码的可扩展性和可维护性。 多态的定义及实现 多态的构成条件 多态是⼀个继承关系的下的类对象去调⽤同⼀函数产⽣了不同的⾏为。 实现多态还有两个必须重要条件 必须是基类的指针或者引⽤调⽤虚函数 被调⽤的函数必须是虚函数并且完成了虚函数重写/覆盖。 说明要实现多态效果第⼀必须是基类的指针或引⽤因为只有基类的指针或引⽤才能既指向基类 对象⼜指向派⽣类对象第⼆派⽣类必须对基类的虚函数完成重写/覆盖重写或者覆盖了基类和派 ⽣类之间才能有不同的函数多态的不同形态效果才能达到。 虚函数 类成员函数前⾯加virtual修饰那么这个成员函数被称为虚函数。注意⾮成员函数不能加virtual修饰。 class A {public:virtual void() {} };虚函数的重写/覆盖 虚函数的重写/覆盖派⽣类中有⼀个跟基类完全相同的虚函数(即派⽣类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同)称派⽣类的虚函数重写了基类的虚函数。 注意在重写基类虚函数时派⽣类的虚函数在不加virtual关键字时也可以构成重写(因为继承后基类的虚函数被继承下来了在派⽣类依旧保持虚函数属性) 关键技术原理 虚函数表vtable 每个包含虚函数的类自动生成虚函数表存储该类所有虚函数的地址创建对象时隐式添加vptr指针指向vtable 动态绑定过程 #mermaid-svg-cUfgWHoqR4V3r8wC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cUfgWHoqR4V3r8wC .error-icon{fill:#552222;}#mermaid-svg-cUfgWHoqR4V3r8wC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cUfgWHoqR4V3r8wC .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-cUfgWHoqR4V3r8wC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cUfgWHoqR4V3r8wC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cUfgWHoqR4V3r8wC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cUfgWHoqR4V3r8wC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cUfgWHoqR4V3r8wC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cUfgWHoqR4V3r8wC .marker.cross{stroke:#333333;}#mermaid-svg-cUfgWHoqR4V3r8wC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cUfgWHoqR4V3r8wC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cUfgWHoqR4V3r8wC .cluster-label text{fill:#333;}#mermaid-svg-cUfgWHoqR4V3r8wC .cluster-label span{color:#333;}#mermaid-svg-cUfgWHoqR4V3r8wC .label text,#mermaid-svg-cUfgWHoqR4V3r8wC span{fill:#333;color:#333;}#mermaid-svg-cUfgWHoqR4V3r8wC .node rect,#mermaid-svg-cUfgWHoqR4V3r8wC .node circle,#mermaid-svg-cUfgWHoqR4V3r8wC .node ellipse,#mermaid-svg-cUfgWHoqR4V3r8wC .node polygon,#mermaid-svg-cUfgWHoqR4V3r8wC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cUfgWHoqR4V3r8wC .node .label{text-align:center;}#mermaid-svg-cUfgWHoqR4V3r8wC .node.clickable{cursor:pointer;}#mermaid-svg-cUfgWHoqR4V3r8wC .arrowheadPath{fill:#333333;}#mermaid-svg-cUfgWHoqR4V3r8wC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cUfgWHoqR4V3r8wC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cUfgWHoqR4V3r8wC .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-cUfgWHoqR4V3r8wC .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-cUfgWHoqR4V3r8wC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cUfgWHoqR4V3r8wC .cluster text{fill:#333;}#mermaid-svg-cUfgWHoqR4V3r8wC .cluster span{color:#333;}#mermaid-svg-cUfgWHoqR4V3r8wC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cUfgWHoqR4V3r8wC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基类指针 查询对象vptr 访问vtable 调用实际函数地址 最佳实践指南 使用override关键字明确重写意图 基类析构函数必须声明为virtual 接口类使用纯虚函数 性能考量虚函数调用比普通函数多一次指针解引用 虚函数重写 协变 派⽣类重写基类虚函数时与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引⽤派⽣类虚函数返回派⽣类对象的指针或者引⽤时称为协变。 核心概念 基类虚函数返回基类类型指针 / 引用。派生类重写函数返回派生类类型指针 / 引用。编译器会自动处理类型转换确保调用的一致性。 协变的条件 基类函数必须为虚函数。返回类型必须是指针或引用不能是值类型。派生类返回类型必须是基类返回类型的公有派生类。函数签名的其他部分参数、常量性必须完全相同。 析构函数的重写 基类的析构函数为虚函数此时派⽣类析构函数只要定义⽆论是否加virtual关键字都与基类的析构函数构成重写虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则实际上编译器对析构函数的名称做了特殊处理编译后析构函数的名称统⼀处理成destructor所以基类的析构函数加了vialtual修饰派⽣类的析构函数就构成重写。 class A{public:virtual ~A(){cout ~A() endl;} };class B : public A {public:~B(){ cout ~B()-delete:_p endl;delete _p;}protected:int* _p new int[10]; };int main() {A* p1 new A;A* p2 new B;delete p1;delete p2;return 0; }如果~A()不加virtual那么delete p2时只调⽤的A的析构函数没有调⽤B的析构函数就会导致内存泄漏问题因为 ~B()中在释放资源。 只有派⽣类Student的析构函数重写了Person的析构函数下⾯的delete对象调⽤析构函数才能构成多态才能保证p1和p2指向的对象正确的调⽤析构函数。 override和final关键字 override 关键字 作用 明确标记一个函数是重写基类的虚函数编译器会检查以下条件 基类中是否存在同名虚函数。 基类和派生类的函数签名参数、常量性、引用限定符是否严格一致。 返回类型是否符合协变规则如果适用。final 关键字 作用 final 有两种用法 修饰虚函数禁止派生类重写该虚函数。 修饰类禁止该类被继承。 纯虚函数和抽象类 在虚函数的后⾯写上0则这个函数为纯虚函数纯虚函数不需要定义实现(实现没啥意义因为要被派⽣类重写但是语法上可以实现)只要声明即可。包含纯虚函数的类叫做抽象类抽象类不能实例化出对象如果派⽣类继承后不重写纯虚函数那么派⽣类也是抽象类。纯虚函数某种程度上强制了派⽣类重写虚函数因为不重写实例化不出对象 纯虚函数在基类中声明为virtual并且没有实现的函数形式为virtual void func() 0;。抽象类包含纯虚函数的类称为抽象类不能实例化对象只能作为基类被派生。示例class Shape { public:virtual void draw() 0; // 纯虚函数 };class Circle : public Shape { public:void draw() override {cout Drawing Circle endl;} };Shape是一个抽象类Circle是派生类重写了draw()函数。多态的使用Shape* shape new Circle(); shape-draw(); // 输出Drawing Circle多态的原理 多态是如何实现的 在C中多态主要通过虚函数virtual functions和继承机制来实现。以下是多态实现的详细过程和原理 1. 虚函数表vtable 概念每个包含虚函数的类都会有一个虚函数表vtable它是一个存储虚函数地址的数组。当创建一个类的对象时对象会包含一个指向其类的虚函数表的指针vptr。作用vtable是实现多态的关键。当通过基类指针或引用调用虚函数时程序会通过vptr找到对应的vtable然后通过vtable找到实际的虚函数地址。 虚函数表知识要点 基类对象的虚函数表中存放基类所有虚函数的地址。同类型的对象共⽤同⼀张虚表不同类型的对象各⾃有独⽴的虚表所以基类和派⽣类有各⾃独⽴的虚表。派⽣类由两部分构成继承下来的基类和⾃⼰的成员⼀般情况下继承下来的基类中有虚函数表指针⾃⼰就不会再⽣成虚函数表指针。但是要注意的这⾥继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个就像基类对象的成员和派⽣对象中的基类对象成员也独⽴的。派⽣类中重写的基类的虚函数派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。派⽣类的虚函数表中包含(1)基类的虚函数地址(2)派⽣类重写的虚函数地址完成覆盖派⽣类⾃⼰的虚函数地址三个部分。虚函数表本质是⼀个存虚函数指针的指针数组⼀般情况这个数组最后⾯放了⼀个0x00000000标记。此条取决于编译器虚函数存储的位置vs下为常量区 可以自行验证 class Base {public:virtual void func1() {}protected:int a 1; };class Derive : public Base { public:virtual void func1() {} protected:int b 2; };int main() {int i 0;static int j 1;int* p1 new int;const char* p2 xxxxxxxx;printf(栈:%p\n, i);printf(静态区:%p\n, j);printf(堆:%p\n, p1);printf(常量区:%p\n, p2);Base b;Base* p3 b;printf(虚表地址:%p\n, *(int*)p3);return 0; } //通过比较虚表地址找到其最近的内存片段来确定2. 虚函数的声明 在类中使用virtual关键字声明函数为虚函数。 Base为基类Derived为继承类。class Base { public:virtual void show() {cout Base show() endl;} };class Derived : public Base { public:void show() override { // override表示重写基类的虚函数cout Derived show() endl;} };Base类的show()函数被声明为虚函数Derived类重写了这个虚函数。 3. 多态的实现过程 创建对象Derived d;当创建Derived类的对象d时对象中会包含一个vptr指向Derived类的vtable。Derived类的vtable中存储了Derived类重写的虚函数show()的地址。 通过基类指针或引用调用虚函数Base* ptr d; ptr-show();ptr是一个指向Base类的指针但它指向的是Derived类的对象。当调用ptr-show()时程序会通过ptr找到对象的vptr然后通过vptr找到Derived类的vtable最终调用Derived类的show()函数。这就是多态的运行时绑定动态绑定过程。 动态绑定与静态绑定 • 对不满⾜多态条件(指针或者引⽤调⽤虚函数)的函数调⽤是在编译时绑定也就是编译时确定调⽤函数的地址叫做静态绑定。 • 满⾜多态条件的函数调⽤是在运⾏时绑定也就是在运⾏时到指向对象的虚函数表中找到调⽤函数的地址也就做动态绑定。
http://www.w-s-a.com/news/776479/

相关文章:

  • 众筹网站平台建设工信部网站备案系统
  • 网站301重定向代码wordpress 加子目录
  • 淄博网站制作优化推广asp做学生信息网站
  • 海口招商建设有限公司网站淮安哪有专业做网站的公司
  • 喀什哪有做网站的国内正规seo网络推广
  • 网站设计初步规划公司网页打不开是什么原因
  • 深圳企业网站建设推广服务php做的商城网站设计论文
  • 韩雪冬网站手机网站开发 宽度
  • 奉贤专业做网站新手怎么做企业网站
  • 做网站用哪几个端口 比较好手机号网站源码
  • 手机免费代理ip网站那个旅游网站做攻略最好
  • 西安做网站找哪家公司好苏州专业网站建设开发
  • dedecms如何做网站网站设计实施方案
  • 网站建设合约品牌设计有哪些
  • 织梦企业门户网站宝塔搭建wordpress网站
  • 网站为什么没有排名了11月将现新冠感染高峰
  • 网站开发维护专员岗位职责辽阳企业网站建设
  • 做外国订单有什么网站网站设计论文提纲
  • 商城网站建设报价方案导师让做网站
  • 清远市企业网站seo联系方式动易官方网站
  • 手机上怎么做能打开的网站一级域名和二级域名跨域
  • 网站首页效果图wordpress 在线教育
  • 电商网站开发团队广西桂林商贸旅游技工学校
  • 网站模板文件怎么下载东莞常平镇邮政编码
  • 建网站需要什么wordpress误删的后果
  • wordpress无插件实现网站地图做阿里巴巴网站店铺装修费用
  • 英文互动网站建设南宁住房和城乡建设局网站
  • 威海微网站建设乐清建网站哪家强
  • 网站和app的开发成本saas系统开发教程
  • ps切片工具做网站大气简洁网站