什么是c++中的多态

本文介绍了C++中多态的概念及其重要性。多态作为面向对象编程的核心特性之一,允许同一接口实现不同行为。文章详细解释了编译时多态(通过重载实现)和运行时多态(通过虚函数实现),并阐述了多态如何促进接口复用。

什么是c++中的多态

  • 引言
    多态(Polymorphism)、封装(Encapsulation)和继承(Inheritance)是面向对象思想的“三大特征”,此处俗称“面向对象的三板斧”,而多态是三板斧中最厉害的杀招,是面向对象最精微的内功,可以说,不理解多态就不懂得什么是面向对象。

  • 定义
    同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
    简单地概括为“一个接口,多种方法”。

  • 类别
    (1)编译时的多态性。
      编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。(参考我的博文《c++中的函数重载》)
    (2)运行时的多态性。
      运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C++中,运行时的多态性通过虚成员实现。

  • 作用
    多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

C++中,多态(polymorphism)通俗来说就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)[^2]。 编译时多态(静态多态)主要包括函数重载和函数模板,通过传递不同类型的参数可以调用不同的函数,以参数的不同来实现多种形态。由于实参传给形参的参数匹配是在编译时完成的,一般把编译时归为静态,所以称为编译时多态[^2]。 以下是函数重载和函数模板实现编译时多态的示例代码: ```cpp #include <iostream> // 函数重载示例 int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } // 函数模板示例 template <typename T> T add_template(T a, T b) { return a + b; } int main() { // 函数重载调用 std::cout << "Function overloading (int): " << add(1, 2) << std::endl; std::cout << "Function overloading (double): " << add(1.5, 2.5) << std::endl; // 函数模板调用 std::cout << "Function template (int): " << add_template(1, 2) << std::endl; std::cout << "Function template (double): " << add_template(1.5, 2.5) << std::endl; return 0; } ``` 运行时多态(动态多态)通常通过基类指针或引用调用虚函数来实现。当使用基类指针或引用调用虚函数时,程序会在运行时根据对象的实际类型来决定调用哪个类的虚函数实现,这使得不同派生类对象可以对同一函数调用做出不同的响应,从而实现多态性。 以下是运行时多态的示例代码: ```cpp #include <iostream> // 基类 class Shape { public: // 虚函数 virtual void draw() { std::cout << "Drawing a generic shape." << std::endl; } }; // 派生类 class Circle : public Shape { public: void draw() override { std::cout << "Drawing a circle." << std::endl; } }; // 派生类 class Square : public Shape { public: void draw() override { std::cout << "Drawing a square." << std::endl; } }; int main() { Circle circle; Square square; // 基类指针 Shape* shape1 = &circle; Shape* shape2 = &square; // 运行时多态调用 shape1->draw(); shape2->draw(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值