菜鸟森林:简说多态

本文介绍了C++中的多态性,包括它的定义、形成条件及重要性。多态允许基类指针调用派生类的重写函数,增加了程序的灵活性和可扩展性,是面向对象编程的基础特性。文章还提到了赋值兼容和静态多态(函数重载)的概念。
摘要由CSDN通过智能技术生成
  1. 定义
    (1)一般而言 在派生类对象使用基类的方法,而未做任何修改。
    (2)然而,可能会遇到这样的情况,即希望同一个方法在派生类和基类中的行为是不同的。
    (3)换句话来说,方法的行为应取决于调用该方法的对象。这种较复杂的行为称为多态—具有多种形态。
    总结:
    • C++中所谓的多态((Polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一个行为会作出不同响应。
    • C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

  2. 多态形成条件
    (1) 首先要有继承,并且父类中有虚函数
    (2) 子类要重写(覆写–override)父类的虚函数
    (3) 子类对象的地址赋值给基类的指针,通过父类的指针( 父类引用)指向子类对象,调用虚函数

  3. 作用(多态的意义):

  • 能增加程序的灵活性、程序的可扩展性:
    在程序运行过程中展现出动态的特性,在程序实际运行后才能确定具体的函数调用
  • 多态是面向对象组件化程序设计的基础特性:
    设计模式中绝大多数模式都和多态相关
  • 可以减轻系统升级,维护,调试的工作量和复杂度,大大增强。
  1. demo
/*
简而言之,多态条件:
 【1】父类中有虚函数
 【2】子类继承父类
 【3】子类重写虚函数
【4】通过父类指针(引用)调用虚函数
*/
class A
{
public:
    virtual void test()//多态条件:父类中有虚函数
    {

    }
};


class B :public A   //多态条件:有继承
{
public:
    //多态条件:重写虚函数
    virtual void test()
    {
        cout << "B::test" <<" "<<"class B :public A: Bvirtual"<< endl;
    }
};

class C :public B
{
public:

    virtual void test()
    {
        cout << "C::test" << endl;
    }
};

//多态条件:子类对象的地址赋值给基类的指针,通过父类的指针,调用虚函数
void test_fun(A* ps)//A*指针
{
    ps->test();
}

int main(int argc, char *argv[])
{
    B b;
    test_fun(&b); //B::test class B :public A: Bvirtual
    
    C c;
    test_fun(&c); //C::test

    return 0;
}


  1. 知识扩展
    5.1赋值兼容
    赋值兼容是指,在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。只有在公有派生类中才有赋值兼容,赋值兼容是一种默认的行为,不需要任何显示的转换步骤。
    • 派生类对象可以赋值给基类对象
    • 派生类对象可以初始化基类的引用
    • 派生类对象的地址可以赋值给指向基类的指针

5.2 静多态(静态联编)
对于多态,在C++中有两种情况,
(1)静多态。函数重载(overload)其实就是一种多态的表现,同一个函数名,表现出不同的形态。由于函数重载的底层实现是命名倾轧(NameMangling)技术,但是它发生在编译阶段,所以我们把这种多态称为静多态
(2)动多态。我们讲的多态,是发生在程序运行阶段,称之为动多态,也叫多态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值