多态的定义

多态是什么?

  • 多态(polymorphism)是面向对象编程(OOP:object oriented programming)的一个重要特征,顾名思义为多种形态,详细解释为一个接口,多种实现,即方法的实现应取决于调用该方法的对象。多态分为静态多态和动态多态。
  • 静态多态编译时多态是静态多态,在编译时就可以确定使用的接口。静态多态往往通过函数重载函数模板(泛型编程)来实现。
  • 动态多态运行时多态称为动态多态,具体引用的接口在运行时才能确定。最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而调用不同的方法。在使用基类指针或引用指向子类对象时,调用的函数是子类中重写的函数,这样就实现了运行时函数地址的动态绑定,即动态联编。动态多态是通过“继承+虚函数”来实现的,只有在程序运行期间(非编译期)才能判断所引用对象的实际类型,根据其实际类型调用相应的方法。(如果没有使用虚函数,即没有利用 C++ 多态性,则利用基类指针调用相应函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用同一个函数)。
#include <iostream>
using namespace std;

class Drink{
public:
    virtual void drink(){

    }
    virtual ~Drink(){   // 如果子类在堆区申请空间,那么父类指针在delete时
                        //无法调用子类的析构,解决方法是将父类的析构设为
                        //虚析构/纯虚析构

    }
};

class Tea:public Drink{
public:
    Tea(){
        cout << "create Tea fun" << endl;
    }
    void drink(){
        cout << "drink Tea" << endl;
    }
    ~Tea(){
        cout << "destroy Tea fun" << endl;
    }
};

class Milk:public Drink{
public:
    Milk(){
        cout << "create Milk fun" << endl;
    }
    void drink(){
        cout << "drink Milk" << endl;
    }
    ~Milk(){
        cout << "destroy Milk fun" << endl;
    }
};

int main(int argc, char const *argv[])
{
    Drink* t = new Tea;   //"create Tea fun"
    t->drink();           //"drink Tea"
    delete t;             //"destroy Tea fun"
    t = NULL;

    Drink* m = new Milk;    //"create Milk fun"
    m->drink();             //"drink Milk"
    delete m;               //"destroy Milk fun"
    m = NULL;

    return 0;
}

在Java中,多态允许我们使用父类型的引用(父类对象或接口对象)来创建和操作子类的对象。这意味着你可以用统一的方式来处理各种不同类型的对象,这与直接定义特定类型对象的主要区别在于灵活性和通用性。 **动态绑定(晚绑定) vs 静态绑定(早绑定)** 1. **直接定义对象(静态绑定)**: 当你在代码中明确指定一个变量的类型,并直接创建该类型对象实例时,编译器会在编译阶段确定调用的具体方法。例如: ```java Animal myAnimal = new Dog(); myAnimal.eat(); // 直接调用Dog类的eat方法 ``` 这里,`eat()`方法是在编译时确定的,不会随着运行时对象的实际类型改变。 2. **使用多态(动态绑定)**: 使用父类型的引用,如`Animal`类型的引用指向一个`Dog`实例时,`eat()`方法的调用会取决于实际对象的类型,这是在运行时根据对象实际类型确定的。比如: ```java Animal myAnimal = new Dog(); // 这里myAnimal是一个Animal类型的引用 myAnimal.eat(); // 实际调用的是Dog类的eat方法 ``` 这里的`eat()`是在运行时根据myAnimal所引用的对象的实际类型来确定的,这就是动态绑定。 **优势**: - 提高代码复用性和灵活性,因为你可以使用相同的接口处理不同类型的具体实现。 - 方便扩展,无需修改已有的客户端代码即可添加新的子类。 **相关问题--:** 1. 多态对于程序设计有哪些好处? 2. 何时你会选择使用多态而不是直接定义对象? 3. 动态绑定是如何影响程序性能的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值