1.了解多态C 语言本身不支持原生多态多态是 C 面向对象编程OOP的三大核心特性封装、继承、多态之一。多态的本质同一个接口调用时表现出不同的行为一个名字多种形态。C 多态分为两大类也是面试和开发中最核心的区分点1.静态多态编译期多态编译时就确定调用的函数2.动态多态运行期多态运行时才确定调用的函数C 多态的核心2.静态多态早绑定在编译阶段编译器就确定了函数的调用地址也叫静态绑定。特点执行效率高灵活性低。三种实现形式1.函数重载同一个作用域下函数名相同参数列表个数、类型、顺序不同与返回值无关。#include iostream using namespace std; // 函数重载 void print(int a) { cout 整数 a endl; } void print(double b) { cout 浮点数 b endl; } void print(string s) { cout 字符串 s endl; } int main() { print(10); // 编译期直接匹配 int 版本 print(3.14); // 编译期直接匹配 double 版本 return 0; }2.运算符重载对 C 原有运算符重新定义适配自定义类型如复数、类对象。3.模板函数 / 类模板泛型编程一套代码适配多种数据类型编译期生成对应类型的函数。// 函数模板 template typename T T add(T a, T b) { return a b; }3.动态多态晚绑定在运行阶段才确定函数的调用地址也叫动态绑定。特点灵活性极高是面向对象设计的核心用于解耦代码。实现条件缺一不可1.存在 继承关系2.基类定义 虚函数virtual 关键字修饰3.派生类 重写 基类的虚函数4.使用 基类指针 / 引用 指向派生类对象调用虚函数我们用「动物发声」来演示多态#include iostream using namespace std; // 基类动物 class Animal { public: // 虚函数动态多态的核心 virtual void speak() { cout 动物发出通用声音 endl; } }; // 派生类狗继承 Animal class Dog : public Animal { public: // 重写基类的虚函数override 关键字建议加上用于校验 void speak() override { cout 汪汪汪 endl; } }; // 派生类猫继承 Animal class Cat : public Animal { public: void speak() override { cout 喵喵喵 endl; } }; // 统一接口接收基类指针调用虚函数 void makeSound(Animal* animal) { animal-speak(); } int main() { Dog dog; Cat cat; // 同一个接口 makeSound传入不同对象执行不同逻辑 makeSound(dog); // 输出汪汪汪 makeSound(cat); // 输出喵喵喵 return 0; }✅ 这就是多态接口不变行为随对象类型自动变化。3. 1核心概念1虚函数基类中用 virtual 修饰的成员函数是动态多态的基础。派生类重写虚函数时virtual 关键字可写可不写建议保留。2重写override派生类重新实现基类的虚函数要求函数名、返回值、参数列表 完全一致和重载完全不同。3纯虚函数 抽象类纯虚函数没有函数体格式 virtual void speak() 0;抽象类包含纯虚函数的类不能创建对象只能被继承作用强制派生类必须实现该函数定义接口规范// 抽象类无法实例化 class Animal { public: // 纯虚函数 virtual void speak() 0; };4.重载 vs 重写特性函数重载静态多态函数重写动态多态作用域同一个作用域基类 派生类继承关系函数签名函数名同参数不同函数名 / 参数 / 返回值完全相同关键字无virtual必须有virtual绑定时机编译期绑定运行期绑定5.C 语言模拟多态C 没有类、继承、虚函数只能用函数指针手动模拟多态非原生#include stdio.h // 定义函数指针类型 typedef void (*SpeakFunc)(); // 动物结构体模拟基类 struct Animal { SpeakFunc speak; // 函数指针 }; // 狗的行为 void dogSpeak() { printf(汪汪汪\n); } // 猫的行为 void catSpeak() { printf(喵喵喵\n); } int main() { struct Animal dog {dogSpeak}; struct Animal cat {catSpeak}; dog.speak(); // 输出汪汪汪 cat.speak(); // 输出喵喵喵 return 0; }谢谢
c/c++中的多态(上)
发布时间:2026/6/2 10:43:01
1.了解多态C 语言本身不支持原生多态多态是 C 面向对象编程OOP的三大核心特性封装、继承、多态之一。多态的本质同一个接口调用时表现出不同的行为一个名字多种形态。C 多态分为两大类也是面试和开发中最核心的区分点1.静态多态编译期多态编译时就确定调用的函数2.动态多态运行期多态运行时才确定调用的函数C 多态的核心2.静态多态早绑定在编译阶段编译器就确定了函数的调用地址也叫静态绑定。特点执行效率高灵活性低。三种实现形式1.函数重载同一个作用域下函数名相同参数列表个数、类型、顺序不同与返回值无关。#include iostream using namespace std; // 函数重载 void print(int a) { cout 整数 a endl; } void print(double b) { cout 浮点数 b endl; } void print(string s) { cout 字符串 s endl; } int main() { print(10); // 编译期直接匹配 int 版本 print(3.14); // 编译期直接匹配 double 版本 return 0; }2.运算符重载对 C 原有运算符重新定义适配自定义类型如复数、类对象。3.模板函数 / 类模板泛型编程一套代码适配多种数据类型编译期生成对应类型的函数。// 函数模板 template typename T T add(T a, T b) { return a b; }3.动态多态晚绑定在运行阶段才确定函数的调用地址也叫动态绑定。特点灵活性极高是面向对象设计的核心用于解耦代码。实现条件缺一不可1.存在 继承关系2.基类定义 虚函数virtual 关键字修饰3.派生类 重写 基类的虚函数4.使用 基类指针 / 引用 指向派生类对象调用虚函数我们用「动物发声」来演示多态#include iostream using namespace std; // 基类动物 class Animal { public: // 虚函数动态多态的核心 virtual void speak() { cout 动物发出通用声音 endl; } }; // 派生类狗继承 Animal class Dog : public Animal { public: // 重写基类的虚函数override 关键字建议加上用于校验 void speak() override { cout 汪汪汪 endl; } }; // 派生类猫继承 Animal class Cat : public Animal { public: void speak() override { cout 喵喵喵 endl; } }; // 统一接口接收基类指针调用虚函数 void makeSound(Animal* animal) { animal-speak(); } int main() { Dog dog; Cat cat; // 同一个接口 makeSound传入不同对象执行不同逻辑 makeSound(dog); // 输出汪汪汪 makeSound(cat); // 输出喵喵喵 return 0; }✅ 这就是多态接口不变行为随对象类型自动变化。3. 1核心概念1虚函数基类中用 virtual 修饰的成员函数是动态多态的基础。派生类重写虚函数时virtual 关键字可写可不写建议保留。2重写override派生类重新实现基类的虚函数要求函数名、返回值、参数列表 完全一致和重载完全不同。3纯虚函数 抽象类纯虚函数没有函数体格式 virtual void speak() 0;抽象类包含纯虚函数的类不能创建对象只能被继承作用强制派生类必须实现该函数定义接口规范// 抽象类无法实例化 class Animal { public: // 纯虚函数 virtual void speak() 0; };4.重载 vs 重写特性函数重载静态多态函数重写动态多态作用域同一个作用域基类 派生类继承关系函数签名函数名同参数不同函数名 / 参数 / 返回值完全相同关键字无virtual必须有virtual绑定时机编译期绑定运行期绑定5.C 语言模拟多态C 没有类、继承、虚函数只能用函数指针手动模拟多态非原生#include stdio.h // 定义函数指针类型 typedef void (*SpeakFunc)(); // 动物结构体模拟基类 struct Animal { SpeakFunc speak; // 函数指针 }; // 狗的行为 void dogSpeak() { printf(汪汪汪\n); } // 猫的行为 void catSpeak() { printf(喵喵喵\n); } int main() { struct Animal dog {dogSpeak}; struct Animal cat {catSpeak}; dog.speak(); // 输出汪汪汪 cat.speak(); // 输出喵喵喵 return 0; }谢谢