C专家编程 第11章 你懂得C,所以C++不再话下 11.13 多态---运行时绑定

    多态---运行时绑定
    多态(polymorphism)源于希腊语,意思是“多种形状”。在C++中,它的意思是支持相关的对象具有不同的成员函数(但原型相同),并允许对象与适当的成员函数进行动态时绑定。C++通过覆盖(override)支持这种机制---所有的多态成员函数具有相同的名字,由运行时系统判断哪一个最为合适。当使用继承时就要用到这种机制:有时你无法在编译时分辨所拥有的的对象到底是基类对象还是派生类对象。这个判断并调用正确的函数的过程称为“后期绑定”(late binding)。在成员函数前面加上virtual关键字,可以告诉编译器该成员函数是多态的(也就是虚拟函数)。
    在寻常的编译时重载中,函数的原型必须显著不同,这样编译器才能通过查看参数的类型判断需要调用那个函数。但在虚拟函数中,函数的原型必须相同,由运行时系统进行解析,来判断调用哪一个函数。

    关键概念:多态
    多态是指一个函数或操作符只有一个名字,但它可以用于不同的派生类型。每个对象都实现该操作的一种变型,表现一种最适合自身的行为。它始于覆盖一个名字---对同一个名字进行复用,代表不同对象中的相同概念。多态非常有用,因为它可以给类似的东西取相同的名字。运行时系统在几个名字相同的函数中选择正确的一个进行调用,这就是多态。

    给水果类增加一个成员函数,用于为水果去皮(peel)。我们并不研究水果去皮的细节。
    #include <stdio.h>
    class Fruit{
        public: 
            void peel() {
                printf("peeling a base class fruit\n");
            }
            slice();
            juice();
        private: 
            int weight, calories_per_oz;
    };
    当声明一个水果对象,并向下面这样调用peel()成员函数时:
    Fruit banana;
    banana.peel();
    我们将得到一条信息 
    peeling a base class fruit
    我们知道,可以让苹果类的去皮成员函数与水果类的去皮成员函数同名,因为C++会用覆盖的方法进行处理:
    class Apple : public Fruit {
        public:
            void peel() {
                printf("peeling in apple");
            }
            void make_candy_apple(float weight);
    }; 
    让我们声明一个指向水果类的指针,并让他指向一个苹果对象(它继承于水果类),看看当我们试图去皮时会发生什么。
    Fruit *p;
    p = new Apple;
    p->peel();
    你会获得下面这条信息 
    peeling a base class fruit
    换句话说,为苹果类量身定做的peel()成员函数并没有被调用,真正调用的是基类的peel成员函数!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值