zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux下git以及github的连接与使用
    在windows上如何安装python web引擎jinja2
    JS请求服务器并使页面跳转(转)
    Spring MVC中Session的正确用法<转>
    Eclipse上安装GIT插件EGit及使用
    深入理解JavaScript事件循环机制
    React Hooks useContext 进行父子组件传值
    Remove all your local git branches but keep master
    常见的web前端性能优化
    js知识梳理2:对象属性的操作
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10198391.html
Copyright © 2011-2022 走看看