C++特性之多态

今天学习了一下多态的有关知识。

在《C++ Primer》书中,多态特性似乎只在书的后半部分 oo 里面提到。虽然是面向对象中很重要的一个概念,但是并未单独开出一个章节来介绍。

网上找了一些多态的介绍和程序,总结如下:
其底层含义是大内存(父类)中套着许多小内存(子类)

// 父类
class animal
{
public:
    virtual void enjoy()
    {
        std::cout << "bark" << std::endl;
    }
};

// 子类
class dog:public animal
{
public:
    void enjoy()
    {
        std::cout << "dog" << std::endl;
    }
};

如果调用的是小内存(子类)中继承自大内存(父类)的方法,那么会自动调用子类的方法

// 声明一个类型为dog的变量,指向该变量d的animal型指针p来调用多态的函数
    dog d;
    animal *p = &d;
    p->enjoy();

与之对比的是,声明一个animal变量直接调用enjoy方法

// 直接调用父类中enjoy函数
    animal dd;
    dd.enjoy();

如果借助另外一个类来实现的话:

class lady
{
public:
    animal *a;
    lady(animal *oo):a(oo){} // 给成员变量a赋值,即a指向animal类型的变量oo
    void bark()
    {
        a->enjoy();
    }
};

调用时区分的是传给上述类构造函数的指针是指向父类还是指向子类的

lady anna(new dog()); // 转到类lady的构造函数,anna指向新开辟的dog缓冲区
    anna.bark(); // 此时调用bark,是dog类的方法

    lady jane(new animal());// 转到类lady的构造函数,anna指向新开辟的animal缓冲区
    jane.bark(); // 此时调用bark,是animal类的方法

如此一来,代码的自由度将大大提高。多态不愧是面向对象中最核心的特征。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值