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

类的多态(Num020) - 实践

目录

一、静态联编和动态联编:

什么是联编:

 静态联编和动态联编:

代码示例:

实现动态联编的条件:

 二、多态:

虚函数的特点:

虚函数的使用:

代码示例:

三、抽象类:

 代码示例:

头文件:

同名.cpp文件:

四、final:


一、静态联编和动态联编:

什么是联编:

  • 联编,指的是计算机自身彼此关联的过程,在这个过程中确定程序中的操作调用与之前操作的代码段之间的映射关系

  • 比如:函数重载时,编译器会根据函数名和函数的参数来区别要执行的函数(哪一段代码)。这就是建立的一种映射关系,明确函数调用时会执行哪一个代码段

 静态联编和动态联编:

1、静态联编:
指的是联编工作出现在写代码的阶段,又称之为早期联编,或静态约束
2、动态联编:
指的是编译阶段不能确定将要调用的函数,只能在程序运行的时候才能确定将要调用的函数,也就是说在程序运行的时候才将函数实现和函数调用关联。也叫晚期联编,或动态约束

代码示例:

#include
using namespace std;
//静态联编
void fun() {cout << "这是一个函数" << endl;
}
void fun(int x) {cout << "这也是一个函数" << endl;
}
int main() {fun();return 0;
}

实现动态联编的条件:

  1. 必须把动态联编的行为定义为类的虚函数

  2. 必须有类,而且类之间满足父子关系,这个行为通常是重写的父类的虚函数

  3. 必须是先使用基类指针或引用指向派生类对象,然后使用基类指针调用虚函数成员其实动态联编就是多态 

 二、多态:

  • 具有多种形式或者状态

  • 同一个接口,通过不同的对象调用就有不同的效果

多态的实现需要虚函数:
        在类中的函数成员前面加一个virtual关键字即可

虚函数的特点:

  1. 如果在类中定义的虚函数,那么系统会为这个类维护一个虚函数表

  2. 类中会多出4个字节的指针去指向这个虚函数表,在虚函数表中保存了虚函数的首地址,在调用虚函数的时候就会先到表中查找虚函数,然后调用,就比普通函数多了1步操作

  3. 虚函数表不会被继承,但是表中的项会被继承(虚函数会被继承) 

虚函数的使用:

  1. 父类中的虚函数子类通常都会继承重写为自己的功能

  2. 通过父类指针或引用调用的这个虚函数成员,父类指针或引用指向哪一个子对象就是调用哪一个子对象的虚函数成员

  3. 如果子对象是new出来的,那么delete父类指针不会调用子类的析构函数,把父类的析构函数定义为虚析构,那么就会调用子类的析构 

代码示例:

#include
using namespace std;
class animal {
public:virtual void speak() {cout << "这是一个动物会叫" << endl;}animal() {cout << "animal类构造" << endl;}virtual ~animal() {cout << "animal类死亡" << endl;}
};
class cat :public animal {
public:virtual void speak() {cout << "这是一只猫,会喵喵喵" << endl;}
};
class dog :public animal {
public:virtual void speak() {cout << "这是一只狗,会汪汪汪" << endl;}dog() {cout << "dog类构造" << endl;}~dog() {cout << "dog类死亡" << endl;}
};
void zoo(animal* a1) {a1->speak();
}
int main() {//animal a1;//cat c1;animal* d1=new dog;zoo(d1);delete d1;return 0;
}

三、抽象类:

  1. 抽象类也是一个类,只不过不能拿来定义对象

  2. 抽象类是用来描述一些公有的属性和行为的

  3. 一个类中拥有一个纯虚函数,这个类就变为了抽象类

  4. 子类如果继承了抽象类,那么子类必须重写抽象类中的所有纯虚函数(构造析构除外),否则子类也会变为抽象类

  5. 纯虚函数的定义:virtual void fun()=0;不需要实现

 代码示例:

头文件:

#pragma once
#include
using namespace std;
class CHero
{
public:virtual void atk() = 0;
};
class hero1 :public CHero {
public:void atk() {cout << "发射光线" << endl;}
};
class hero2 :public CHero {
public:void atk() {cout << "飞踢" << endl;}
};
class hero3 :public CHero {
public:void atk() {cout << "肘击" << endl;}
};
class bas {
public:virtual void atk() = 0;
};
class bas1 :public bas {
public:void atk() {cout << "怪兽1" << endl;}
};
class bas2 :public bas {
public:void atk() {cout << "怪兽2" << endl;}
};
class bas3 :public bas {
public:void atk() {cout << "怪兽3" << endl;}
};
void atk1(CHero& h1, bas& b1) {h1.atk();b1.atk();
}

同名.cpp文件:

#include "CHero.h"
int main() {hero1 h1;hero2 h2;hero3 h3;bas1 b1;bas2 b2;bas3 b3;atk1(h3, b2);
}

四、final:

  1. 在虚函数的后面加修饰

  2. 在定义类的后面加修饰

http://www.jsqmd.com/news/19409/

相关文章:

  • 2025 年国内活塞杆厂家最新推荐排行榜:聚焦精密 / 不锈钢 / 油缸 / 气缸 / 45# 镀铬类产品,助力企业精准挑选可靠合作方
  • 20232305 2025-2026-1 《网络与系统攻防技术》实验二实验报告
  • 数据类型,二元运算符,自动类型提升规则,关系运算,取余模运算
  • 股票技术面分析平台QuantMatrix深度解析 - 实践
  • WPF使用MediaCapture开发相机应用(四、相机录视频)
  • Gitee本土化战略深度解析:中国开发者生态的合规与效率革命
  • 2025年10月上海装修公司口碑榜:十强对比评测
  • 2025年10月中国婚姻家事与财富管理律师评价榜:五强评测
  • LGP8969 幻梦 Dream with Dynamic
  • 2025年10月中国婚姻家事与财富管理律师推荐榜:五强对比评测
  • 2025年包装机厂家权威推荐榜单:全自动包装机/包装生产线/非标定制机器与生产线专业选购指南
  • Timing Signoff 技术精要
  • Bugku-Web题目-sqli-0x1- HackINI 2021 - 指南
  • 02-GPIO-铁头山羊STM32标准库新版笔记
  • IDC iPaaS市场报告解读:独立厂商与云巨头的“双轨竞速”
  • 从0死磕全栈之Next.js 拦截路由(Intercepting Routes)详解:搭建模态框与上下文保持的利器
  • 科林电气与利驰软件续签合作,共启数字化协同新篇章!
  • 详细介绍:资产信息收集与指纹识别:HTTPX联动工具实战指南
  • 易基因:剑桥大学团队利用微量WGBS等揭示DNMT3L在胎盘发育中的DNA甲基化调控机制:CSC(IF20.5)
  • iOS 26 性能调试工具全景指南 多工具组合 + 实战流程
  • 102302134陈蔡裔数据采集第一次作业
  • 2025年10月蒸汽发生器品牌榜:辰能能源领衔五强对比
  • 2025吹塑机厂家权威推荐:鼎浩包装科技实力企业,专业定制高效生产方案
  • 01-准备-铁头山羊STM32标准库新版笔记
  • 17万+知识点英语维基百科数据集:205万行权威文本语料库驱动AI模型训练与智能系统开发
  • platformio上ESP32-s3,N16R8选择板子的解决方案
  • 2025年10月注册公司推荐:权威榜对比评测
  • 2025年10月工业洗地机厂家推荐:权威评测榜与全维度对比指南
  • YSP_refs_cn_2025
  • 2025年10月洗碗机品牌排名:海信稳居热销榜