C++中多态分为运行时和编译时两种,运行时多态通过虚函数和继承实现,由基类指针或引用在运行时调用派生类重写函数,如Animal基类的speak()被Dog和Cat类重写,通过new创建对象并调用对应版本;纯虚函数用于定义抽象基类,强制派生类实现特定接口,如Shape类的area();编译时多态通过函数重载和模板实现,函数调用在编译期确定,如print函数重载不同类型,模板函数max为不同类型生成独立实例,静态多态效率高但需类型明确,动态多态灵活但有虚函数表开销,应根据需求选择。

在C++中,多态是面向对象编程的核心特性之一,它允许同一接口调用不同对象的特定实现。多态主要通过虚函数和继承机制来实现,分为编译时多态和运行时多态。
运行时多态(动态多态)
运行时多态是C++中最常见的多态形式,依赖于基类指针或引用调用虚函数,在程序运行时确定具体调用哪个派生类的函数。
实现步骤:
- 在基类中声明虚函数(使用 virtual 关键字)
- 派生类重写(override)该虚函数
- 通过基类指针或引用指向派生类对象并调用函数
示例代码:
立即学习“C++免费学习笔记(深入)”;
#includeusing namespace std; class Animal { public: virtual void speak() { cout << "Animal speaks" << endl; } };
class Dog : public Animal { public: void speak() override { cout << "Dog barks" << endl; } };
class Cat : public Animal { public: void speak() override { cout << "Cat meows" << endl; } };
int main() { Animal a1 = new Dog(); Animal a2 = new Cat();
a1-youjiankuohaophpcnspeak(); // 输出: Dog barks a2-youjiankuohaophpcnspeak(); // 输出: Cat meows delete a1; delete a2; return 0;}
在这个例子中,speak() 是虚函数,调用哪个版本由实际对象类型决定,而不是指针类型。
纯虚函数与抽象基类
如果希望基类中的函数没有默认实现,强制派生类提供自己的实现,可以使用纯虚函数。
语法:
virtual 返回类型 函数名() = 0;
mallcloud商城下载mallcloud商城基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离vue的企业级微服务敏捷开发系统架构。并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提
包含纯虚函数的类称为抽象类,不能实例化。
示例:
class Shape { public: virtual double area() = 0; // 纯虚函数 };class Circle : public Shape { double radius; public: Circle(double r) : radius(r) {} double area() override { return 3.14159 radius radius; } };
编译时多态(静态多态)
编译时多态主要通过函数重载和模板实现,调用哪个函数在编译阶段就已确定。
函数重载示例:
void print(int x) { cout << "Integer: " << x << endl; } void print(double x) { cout << "Double: " << x << endl; } void print(string x) { cout << "String: " << x << endl; }模板实现泛型多态:
templateT max(T a, T b) { return (a > b) ? a & b; } 模板在编译时为每种类型生成对应的函数版本,属于静态多态。
基本上就这些。运行时多态靠虚函数表和指针实现,灵活但有轻微性能开销;编译时多态效率高,但需要类型在编译期明确。根据需求选择合适方式即可。











