深入理解C++中的多态性

目录标题


在C++编程中,多态性是一种使得相同的消息或操作可以应用于不同的对象,并根据对象的类型产生不同行为的能力。C++通过虚函数(virtual functions)和继承来实现多态性。本博客将详细介绍C++多态的工作原理,包括静态多态(编译时多态)和动态多态(运行时多态)的概念。

1. 多态性简介

多态性是面向对象程序设计的核心概念之一,它允许你使用统一的接口来操作不同的数据类型。多态可以分为两类:静态多态和动态多态。

2. 静态多态

静态多态,又称为编译时多态,是在编译时决定调用哪个函数。它主要通过函数重载和模板实现。

函数重载

函数重载允许在相同作用域内声明几个功能相似的同名函数,但是这些函数的参数类型或数量不同。

cpp 复制代码
#include <iostream>
using namespace std;

class Print {
public:
    void display(int i) {
        cout << "Displaying int: " << i << endl;
    }

    void display(double d) {
        cout << "Displaying double: " << d << endl;
    }
};

int main() {
    Print p;
    p.display(5);    // 调用 void display(int)
    p.display(5.5);  // 调用 void display(double)
    return 0;
}
模板

模板提供了一种创建泛型类或函数的方法,允许在不同数据类型上进行操作,而不需要为每种数据类型重写代码。

cpp 复制代码
#include <iostream>
using namespace std;

template <typename T>
void display(T t) {
    cout << "Displaying: " << t << endl;
}

int main() {
    display(5);   // 调用 display<int>
    display(5.5); // 调用 display<double>
    return 0;
}

3. 动态多态

动态多态,也称为运行时多态,是在运行时决定调用哪个函数。它是通过虚函数实现的。

虚函数

在基类中声明的函数,在派生类中可以被重写。通过基类指针或引用调用虚函数时,将根据对象的实际类型调用相应的函数。

cpp 复制代码
#include <iostream>
using namespace std;

class Base {
public:
    virtual void display() {
        cout << "Display of Base" << endl;
    }
};

class Derived : public Base {
public:
    void display() override {
        cout << "Display of Derived" << endl;
    }
};

int main() {
    Base* b = new Derived();
    b->display();  // 输出: Display of Derived
    delete b;
    return 0;
}
new动态分配内存

在C++中,new是一个运算符,用于动态分配内存。当你使用new时,它会在堆(heap)上分配一块内存,并返回该内存块的地址。这个地址可以被赋值给一个指针,以便后续通过指针访问这块内存。

在你的代码示例中,new Derived()执行了以下操作:

  1. 调用Derived类的构造函数,创建一个Derived类的对象。
  2. 在堆上分配足够的内存来存储这个Derived对象。
  3. 返回这块内存的地址。

这个地址被赋值给了Base*类型的指针b。由于b是一个指向Base类型的指针,它可以指向任何从Base类派生的对象,这就是多态性的体现。

main函数的最后,delete b;用于释放由new分配的内存。delete运算符会调用对象的析构函数,并释放对象占用的内存。这是非常重要的,因为如果不释放动态分配的内存,就会导致内存泄漏。

总结一下,new在C++中用于动态分配内存,创建对象,并返回指向新对象的指针。而delete用于释放由new分配的内存。

纯虚函数和抽象类

如果类中至少有一个纯虚函数,则该类称为抽象类。抽象类不能实例化,并且通常用作基类。

cpp 复制代码
#include <iostream>
using namespace std;

class Base {
public:
    virtual void display() = 0; // 纯虚函数
};

class Derived : public Base {
public:
    void display() override {
        cout << "Display of Derived" << endl;
    }
};

int main() {
    // Base b; // 错误: 不能创建抽象类的对象
    Base* b = new Derived();
    b->display();  // 输出: Display of Derived
    delete b;
    return 0;
}

4. 多态的应用

多态性在实际编程中非常有用,它使得你可以编写更加通用和可重用的代码。例如,在设计一个图形界面库时,你可能会有一个基类 Shape,以及多个派生类如 RectangleCircle 等。通过多态,你可以使用基类指针来操作所有的派生类对象,从而简化代码和提高可维护性。

5. 总结

多态性是C++提供的一种强大机制,它允许以统一的方式处理不同类型的对象。通过理解和恰当使用多态,可以提高代码的复用性和灵活性,是面向对象程序设计的一个重要概念。

相关推荐
syker21 分钟前
太极指令集架构(TCIS)v1.1与主流指令集比较研究报告
c++·架构
jf加菲猫2 小时前
第1章 认识Qt
开发语言·c++·qt·ui
蒋星熠3 小时前
全栈开发实战指南:从架构设计到部署运维
运维·c++·python·系统架构·node.js·devops·c5全栈
杜子不疼.3 小时前
【C++】深入拆解二叉搜索树:从递归与非递归双视角,彻底掌握STL容器的基石
开发语言·c++
天若有情6733 小时前
从零实现轻量级C++ Web框架:SimpleHttpServer入门指南
开发语言·前端·c++·后端·mvc·web应用
mjhcsp5 小时前
C++ 三分查找:在单调与凸函数中高效定位极值的算法
开发语言·c++·算法
Elnaij6 小时前
从C++开始的编程生活(13)——list和浅谈stack、queue
开发语言·c++
深思慎考10 小时前
微服务即时通讯系统(服务端)——用户子服务实现逻辑全解析(4)
linux·c++·微服务·云原生·架构·通讯系统·大学生项目
草莓火锅12 小时前
用c++使输入的数字各个位上数字反转得到一个新数
开发语言·c++·算法
j_xxx404_12 小时前
C++ STL:阅读list源码|list类模拟|优化构造|优化const迭代器|优化迭代器模板|附源码
开发语言·c++