水头做网站的公司django做网站快吗
2026/1/8 21:23:01 网站建设 项目流程
水头做网站的公司,django做网站快吗,建设银行信用卡管理中心网站,菏泽建筑模板厂家C虚函数 作为C程序员#xff0c;“多态”绝对是绕不开的核心知识点#xff0c;而撑起多态的关键技术#xff0c;正是今天要聊的虚函数。 一、先搞懂#xff1a;虚函数到底是啥#xff1f; 一句话概括#xff1a;基类中加了virtual关键字的成员函数#xff0c;就是虚函…C虚函数作为C程序员“多态”绝对是绕不开的核心知识点而撑起多态的关键技术正是今天要聊的虚函数。一、先搞懂虚函数到底是啥一句话概括基类中加了virtual关键字的成员函数就是虚函数。它的核心“魔法”的是当用基类指针指向子类对象时调用这个函数会自动执行子类的版本而不是基类的举个生活中的例子基类就像“动物”有个“叫”的行为子类是“狗”“猫”继承了“动物”但“叫”的方式不一样狗汪汪、猫喵喵没有虚函数时用“动物指针”指向“狗”调用“叫”会输出“动物叫”认指针类型有了虚函数后同样的指针指向“狗”会输出“汪汪叫”认对象真实身份。这就是虚函数的核心价值——让指针“认清”对象的真实面目实现多态二、3步实现虚函数多态光说不练假把式咱们用代码一步步实现上面的“动物叫”例子一看就懂第一步定义基类给函数加virtual先创建“动物”基类把“叫”函数设为虚函数加virtual关键字#includeiostreamusingnamespacestd;// 基类动物classAnimal{public:// 虚函数动物叫virtualvoidmakeSound(){cout动物发出叫声endl;}};第二步定义子类重写虚函数创建“狗”和“猫”两个子类继承Animal并重写makeSound函数。这里可以加override关键字可选但强烈推荐明确表示“我在重写基类的虚函数”避免写错参数/返回值// 子类狗继承动物classDog:publicAnimal{public:// 重写虚函数加override更规范voidmakeSound()override{cout汪汪汪小狗在叫endl;}};// 子类猫继承动物classCat:publicAnimal{public:voidmakeSound()override{cout喵喵喵小猫在叫endl;}};第三步测试多态效果用基类指针指向不同的子类对象调用makeSound看看会不会自动匹配对应版本intmain(){// 基类指针Animal*animalPtr;// 指向狗对象Dog dog;animalPtrdog;animalPtr-makeSound();// 输出汪汪汪小狗在叫// 指向猫对象Cat cat;animalPtrcat;animalPtr-makeSound();// 输出喵喵喵小猫在叫return0;}运行结果完全符合预期同一个基类指针指向不同子类对象时自动调用子类的函数——这就是虚函数实现的多态是不是很简单三、必记避坑点3个关键规则学会用法还不够这3个坑一定要避开否则容易出bug或内存泄漏1. 析构函数必须设为虚函数如果基类指针指向子类对象删除指针时如果析构函数不是虚函数会只调用基类的析构函数子类的资源释放不掉导致内存泄漏正确做法基类析构函数加virtualclassAnimal{public:virtualvoidmakeSound(){...}// 虚析构函数virtual~Animal(){cout动物基类析构endl;}};classDog:publicAnimal{public:voidmakeSound()override{...}~Dog()override{cout小狗子类析构endl;}};// 测试删除基类指针指向的子类对象Animal*ptrnewDog();deleteptr;// 会先调用Dog析构再调用Animal析构无内存泄漏2. 这两个函数不能是虚函数构造函数对象还没创建完成虚函数表还没初始化无法实现虚函数效果静态函数静态函数属于类不属于对象而虚函数依赖对象的真实类型冲突。3. 用override明确重写避免笔误重写时如果参数类型、个数、返回值写错比如把void makeSound()写成void makeSound(int)编译器不会报错而是当成新函数——加了override后编译器会检查是否真的重写了基类虚函数有错直接提示四、一句话总结虚函数的核心就是用virtual关键字标记基类函数让子类能重写最终实现“基类指针指向子类对象时调用子类函数”的多态效果。掌握虚函数你就打通了C多态的“任督二脉”后续学习继承、接口设计等知识点都会更轻松

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询