外贸黄页网站wordpress怎么读

张小明 2025/12/30 8:31:35
外贸黄页网站,wordpress怎么读,网站建设的基本流程是什么,线下课程seo一. 多态的概念#xff1a;从“多种形态说起” 1.1 多态的概念解析 多态通俗来说就是 “多种形态” #xff0c;在C中分为两类 编译时多态(静态多态)#xff1a;通过函数模板#xff0c;重载来实现#xff0c;编译阶段确定调用的函数(如add(1,2)和add(1,2,3,4)调用的不…一. 多态的概念从“多种形态说起”1.1 多态的概念解析多态通俗来说就是“多种形态”在C中分为两类编译时多态(静态多态)通过函数模板重载来实现编译阶段确定调用的函数(如add(1,2)和add(1,2,3,4)调用的不同的函数)运行时多态(动态多态)本篇博客核心讲解的地方通过”基类指针/引用 虚函数重写“运行阶段根据指向的对象的类型确定调用的函数本文代码示例所需头文件#include iostream using namespace std;1.2 生活中的多态示例最经典的场景就是“买票行为”普通人买票 - 全价学生买票 - 半价用样是“买票”不同对象执行不同逻辑这就是多态的本质。我们接下来会在代码中通过继承和多态来实现“调用同一函数”产生不同结果。二. 多态的构成条件和核心语法多态是一个继承关系下的类对象去调用同一函数产生了不同的行为。比如Student继承了Person。Person对象买票全价Student对象优惠买票(当然再来个军人对象继承Person的话这个对象去调用也会由不同的结果)要实现多态除了要有继承关系还必须满足下面这两个强制条件缺一不可必须是基类的指针或者引用调用虚函数被调用的函数必须是虚函数并且派生类对基类的虚函数完成了 “重写” (覆盖)。说明要实现多态的效果第一必须是基类的指针或者引用因为只有基类的指针或引用才能既指向基类对象又指向派生类对象第二派生类必须对基类的虚函数完成重写/覆盖重写了基类和派生类之间才能有不同的函数多态的不形态效果才能达到。2.1 条件 1虚函数的定义类成员函数前加virtual关键字该函数即为虚函数非成员函数和静态成员函数不能加virtual。虚函数的作用是 “标记” 该函数需要参与多态让编译器为其生成动态绑定逻辑。// 基类Person class Person { public: // 虚函数标记为需要参与多态 virtual void BuyTicket() { cout 买票-全价 endl; } };2.2 条件 2虚函数的重写覆盖派生类中定义一个 “与基类虚函数完全一致” 的函数即为重写。这里 “完全一致” 指函数名相同参数列表参数类型、个数、顺序相同缺省参数可以不管返回值类型相同协变除外下文讲解。代码示例注意看注释// 基类Person class Person { public: // 虚函数标记为需要参与多态 virtual void BuyTicket() { cout 买票-全价 endl; } }; // 派生类Student继承Person class Student : public Person { public: // 重写基类虚函数函数名、参数、返回值完全一致 // 派生类中virtual也可以省略 virtual void BuyTicket() { cout 买票-打折 endl; } }; // 派生类Soldier继承Person class Soldier : public Person { public: // 重写基类虚函数 // 派生类中virtual也可以省略 virtual void BuyTicket() { cout 买票-优先 endl; } }; // 关键用基类指针调用虚函数满足多态条件1 // 这里也可以用基类引用 void Func(Person* ptr) { // 运行时根据ptr指向的对象类型调用对应类的BuyTicket // Person* ptr ptr-BuyTicket(); // 如果是基类引用(Person ptr) //ptr.BuyTicket(); } int main() { Person ps; // 基类对象 Student st; // 派生类对象学生 Soldier sr; // 派生类对象军人 Func(ps); // 指向基类对象 → 调用Person::BuyTicket → 输出“买票-全价” Func(st); // 指向学生对象 → 调用Student::BuyTicket → 输出“买票-打折” Func(sr); // 指向军人对象 → 调用Soldier::BuyTicket → 输出“买票-优先” return 0; }注意派生类重写时即使不加virtual也能构成重写因为基类虚函数的 “虚属性” 会被继承但不建议这么写可读性差且易出错。坑点下面的笔试题会有体现在 C 中虚函数重写时若基类和派生类的虚函数都指定了缺省参数调用时的缺省值只由“基类的函数声明”决定与派生类的重写实现无关。2.3 多态场景的一个笔试选择题重要以下程序输出的结果是什么BA: A-0 B: B-1 C: A-1 D: B-0 E: 编译出错 F: 以上都不正确class A { public: virtual void func(int val 1) { std::cout A- val std::endl; } virtual void test() { func(); } }; class B : public A { public: void func(int val 0) { std::cout B- val std::endl; } }; int main(int argc, char* argv[]) { B* p new B; p-test(); return 0; }图解如下改编扩展以下程序输出的结果是什么DA: A-0 B: B-1 C: A-1 D: B-0 E: 编译出错 F: 以上都不正确class A { public: virtual void func(int val 1) { std::cout A- val std::endl; } virtual void test() { func(); } }; class B : public A { public: void func(int val 0) { std::cout B- val std::endl; } }; int main(int argc, char* argv[]) { B* q new B; q-func(); return 0; }图解如下三、虚函数重写的特殊情况虚函数重写并非只有 “完全一致” 一种情况还有两种特殊场景需要注意协变和析构函数重写这也是面试高频考点。3.1 协变了解派生类重写基类虚函数时返回值类型可以不同但必须满足基类虚函数返回 “基类对象的指针 / 引用”派生类虚函数返回 “派生类对象的指针 / 引用”。这种情况称为“协变”实际开发中使用较少了解即可。代码示例注意看注释#include iostream using namespace std; // 基类A class A {}; // 派生类B继承A class B : public A {}; // 基类Person class Person { public: // 虚函数返回基类A的指针 virtual A* BuyTicket() { cout 买票-全价 endl; return nullptr; } }; // 派生类Student class Student : public Person { public: // 重写返回派生类B的指针协变 virtual B* BuyTicket() { cout 买票-打折 endl; return nullptr; } }; void Func(Person* ptr) { ptr-BuyTicket(); // 多态调用依然生效 } int main() { Person ps; Student st; Func(ps); // 输出“买票-全价” Func(st); // 输出“买票-打折” return 0; }3.2 析构函数的重写重点基类的析构函数为虚函数基类析构函数加virtual后派生类析构函数无论是否加virtual都构成重写。这是因为编译器会将所有析构函数的名称统一处理为destructor看似名称不同实则一致。注意这个在面试题中经常考到问基类中的析构函数建不建议写成虚函数大家可以结合下面的代码示例和为什么去进行回答这样才能讲清楚为什么需要析构函数构成重写如果基类析构函数不是虚函数用基类指针指向派生类对象并delete时只会调用基类析构函数导致派生类中动态申请的资源无法释放引发内存泄漏。代码示例注意看注释其中额外测试部分是补充了解的和这里的重点不同class A { public: // 基类析构函数加virtual支持重写 virtual ~A() { cout ~A() endl; } }; class B : public A { public: // 派生类析构函数自动构成重写加不加virtual都可以 ~B() { cout ~B()-delete: _p endl; delete _p; // 释放派生类动态申请的资源 } protected: int* _p new int[10]; // 派生类动态申请的数组 }; void test() { cout --------额外测试结果-------- endl; //额外测试这个是正常场景加不加都行 //只是为了让大家了解一下这个析构顺序 //析构顺序~B(),~A(),~A() //其中第一个~A()是因为子类B析构完后调用基类的先子后父,后面一个是a对象析构 A a; B b; } // 基类只要保障了析构函数是虚函数下面场景就不会存在内存泄漏 int main() { // 基类指针指向派生类对象 A* ptr1 new B; delete ptr1; // 多态调用先调用~B()再先子后父自动调用~A()无内存泄漏 // 基类指针指向基类对象 A* ptr2 new A; delete ptr2; // 调用~A() test(); return 0; }主要测试版块如果基类析构不加virtualdelete ptr1只会调用~A()B类中_p指向的数组未释放导致内存泄漏。额外测试那里加不加都行。四. C11override 与 final 关键字虚函数重写对语法要求严格如函数名写错、参数类型不匹配这些错误编译时不会报错只会在运行时出现非预期结果。C11 提供override和final两个关键字帮我们在编译阶段检测错误。4.1 override检测是否重写在派生类虚函数后加override编译器会检查该函数是否真的重写了基类虚函数。若未重写如函数名错、参数错直接编译报错。代码示例注意看注释class Car { public: // 基类虚函数Drive注意拼写是Drive不是Dirve virtual void Drive() { cout Car-行驶 endl; } }; class Benz : public Car { public: // 错误示例函数名写成Dirve加override后编译报错 // virtual void Dirve() override { cout Benz-舒适 endl; } // 正确示例函数名正确override检测通过 virtual void Drive() override { cout Benz-舒适 endl; } }; int main() { Car* p new Benz; p-Drive(); // 多态调用输出“Benz-舒适” return 0; }4.2 final禁止重写在基类虚函数后加final表示该虚函数不允许任何派生类重写。若派生类强行重写编译报错。代码示例注意看注释class Car { public: // 基类虚函数加final禁止派生类重写 virtual void Drive() final { cout Car-行驶 endl; } }; class Benz : public Car { public: // 错误Drive()被final修饰无法重写编译报错 // virtual void Drive() override { cout Benz-舒适 endl; } }; int main() { return 0; }五. 易混淆概念重载、重写、隐藏的对比(常考)多态相关的三个概念重载、重写(覆盖)、隐藏(重定义)极易混淆我们通过下面的图片代码示例和表格来加强一下对它们的区分代码示例借鉴-注意看注释特性重载Overload重写Override隐藏Hide作用域同一类同一作用域基类与派生类不同作用域基类与派生类不同作用域函数名必须相同必须相同必须相同参数列表必须不同类型/个数/顺序必须相同可相同可不同返回值类型无要求必须相同协变除外无要求虚函数要求无必须都是虚函数无核心场景同一类中同名函数的不同实现多态的核心动态绑定派生类屏蔽基类同名成员非重写底层机制编译期静态绑定通过参数列表区分函数运行期动态绑定依赖虚函数表编译期静态绑定通过作用域区分示例class A { void func(int); void func(double); }class A { virtual void func(); }; class B : public A { void func() override; }class A { void func(); }; class B : public A { void func(int); }注意事项仅在同一类中生效派生类中若与基类函数同名且参数不同会隐藏基类函数重写时函数签名函数名参数返回值必须严格一致析构函数重写有特殊性若派生类函数与基类虚函数同名但参数不同会隐藏基类虚函数导致多态失效
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建设网站 安全事项给网站做排名优化学什么好处

还在为新电脑预装的大量无用软件烦恼吗?Win11Debloat正是你需要的解决方案。这个强大的PowerShell脚本工具专为Windows系统优化而生,能够一键移除预装应用、禁用隐私收集功能,让你的系统运行如飞。 【免费下载链接】Win11Debloat 一个简单的P…

张小明 2025/12/29 4:25:48 网站建设

用vs做网站界面大连网站制作公司

文章介绍了Clinical-R1-3B模型及其训练方法CRPO(临床目标相对策略优化),这是一种专为医疗领域设计的多目标强化学习方法。CRPO通过规则化奖励机制,联合优化准确性、可信性和全面性三个核心目标,使模型不仅追求答案正确,更注重推理…

张小明 2025/12/29 4:25:12 网站建设

老网站权重低的原因官方网站建设心得

3步掌握QMCDecode:终极QQ音乐加密音频解密指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果…

张小明 2025/12/29 4:24:35 网站建设

天津建设厅 注册中心网站首页邹平建设项目网站公示

Kohya_SS训练指南:从零开始掌握AI模型个性化定制 【免费下载链接】kohya_ss 项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss 你是否曾经遇到过这样的困扰:看到别人训练出的精美AI模型,自己却不知从何入手?面…

张小明 2025/12/29 4:23:58 网站建设

免费网站设计模板wordpress投稿图片大小

前言:市场进程中的“双生”困惑 在数据要素市场化浪潮奔涌的今天,“确权”与“定价”如同形影不离的孪生概念,频繁地交织在政策文件、行业报告与学术讨论之中。一种普遍的、近乎直觉的线性逻辑由此产生:先通过确权为数据资产“颁…

张小明 2025/12/29 4:23:23 网站建设

给金融的做网站 犯法吗制作asp.net网站

物联网设备日志分析难?结合Anything-LLM实现语义搜索 在现代物联网系统中,运维人员每天面对的不是一台设备,而是成百上千个分布在不同位置、运行着不同固件版本、使用多种通信协议的终端。它们持续不断地产生日志:温度异常、连接中…

张小明 2025/12/29 4:22:45 网站建设