• c/c++ 继承与多态 引用有的时候并不能达到多态的效果


    继承与多态 引用有的时候并不能达到多态的效果

    问题:c++ primer 第五版说,只有指针和引用调用虚函数时才会发生动态绑定(多态)。实践一下,发现引用有的时候不能发生多态绑定(多态)。

    下面的例子,父类是Quote,在Quote里定义了一个虚函数debug,用来打印出各自成员的值。2个子类Bulk_quote和Mix_quote重写了debug方法。

    Quote.h

    #ifndef __QUOTE_H__
    #define __QUOTE_H__
    
    #include <iostream>
    #include <memory>
    
    class Quote{
     public:
      Quote() = default;
      Quote(const std::string& book, double pri)
        :bookNo(book), price(pri){}
      std::string isbn() const{return bookNo;}
      virtual void debug()const{
        std::cout << bookNo << " " << price << std::endl;
      }
      virtual ~Quote() = default;
     private:
      std::string bookNo;
     protected:
      double price = 0.0;
    };
    
    class Bulk_quote : public Quote{
     public:
      Bulk_quote() = default;
      Bulk_quote(const std::string&, double, std::size_t,
    	     double);
      void debug()const override;
     private:
      std::size_t min_qty = 0;//适用于折扣的最低购买数量
      double discount = 0.0;//折扣额
    };
    
    class Min_quote : public Quote{
     public:
      Min_quote() = default;
      Min_quote(const std::string&, double, std::size_t,
    	     double);
      void debug()const override;
     private:
      std::size_t max_qty = 10;//适用于折扣的最高购买数量
      double discount = 0.1;//折扣额
    };
    
    #endif
    
    

    Quote.cpp

    #include "Quote.h"
    
    Bulk_quote::Bulk_quote(const std::string& book, double p,
    		       std::size_t qty, double disc):
      Quote(book, p), min_qty(qty), discount(disc){}
    
    
    void Bulk_quote::debug()const{
      std::cout << min_qty << " " << discount << " " << price << std::endl;
    }
    Min_quote::Min_quote(const std::string& book, double p,
    		       std::size_t qty, double disc):
      Quote(book, p), max_qty(qty), discount(disc){}
    
    
    void Min_quote::debug()const{
      std::cout << max_qty << " " << discount << " " << price << std::endl;
    }
    
    

    mainQuote.cpp

    #include "Quote.h"
    
    int main(){
    
      /*-----------test1-----------*/
      Quote& q1 = q;
      q1.debug();
      q1 = bq;
      q1.debug();
      q1 = mq;
      q1.debug();
      /*-----------test1-----------*/
      
      /*-----------test2-----------*/
      Quote& q1 = mq;
      q1.debug();
      q1 = bq;
      q1.debug();
      q1 = q;
      q1.debug();
      /*-----------test2-----------*/
        
      /*-----------test3-----------*/
      Quote* q2 = &q;
      q2->debug();
      q2 = &bq;
      q2->debug();
      q2 = &mq;
      q2->debug();
      /*-----------test3-----------*/
        
      /*-----------test4-----------*/
      Quote* q2 = &mq;
      q2->debug();
      q2 = &bq;
      q2->debug();
      q2 = &q;
      q2->debug();
      /*-----------test4-----------*/
    }
    
    

    test1的执行结果:

    01 100
    01 100
    01 100
    

    test2的执行结果:

    15 0.1 100
    15 0.1 100
    15 0.1 100
    

    test3的执行结果:

    01 100
    5 0.1 100
    15 0.1 100
    

    test4的执行结果:

    15 0.1 100
    5 0.1 100
    01 100
    

    从上面的执行结果可以看出,以下几点:

    1,根据test1可以看出:引用只有在:Quote& q1 = mq;的情况下,才会引发动态绑定(多态);而在:q1 = bq;的情况下,不会引发动态绑定(多态)。但是指针可以。

    2,根据test2可以看出:给q1赋值后:Quote& q1 = mq;后面再把父类对象q或者子类对象bq,赋值给q1,也不会引发动态绑定(多态),而且最变态的是,q1既没有变成父类的q,也没有变成子类的bq,这是为什么???

    3,用指针代替引用,执行和test1和test2完全一样的操作,发现指针完美的引发了动态绑定(多态)。

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    Kinect学习笔记(六)——深度数据测量技术及应用
    [device]/proc/devices and /dev/
    [Eth]Mac/Phy/mdio/Rgmii
    [uboot]uboot如何引导系统
    [网络]Linux一些网络知识
    [基础]sizeof和strlen
    [基础]关于extern指针和数组的用法
    [ucos]了解ucos
    [Linux]gcc/libc/glibc
    [i.MX6q]i.MX6q处理器,linux操作系统平台搭建 从SD卡启动系统
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10198391.html
Copyright © 2020-2023  润新知