c/c++语言开发共享c/c++ 继承与多态 引用有的时候并不能达到多态的效果

继承与多态 引用有的时候并不能达到多态的效果 问题:c++ primer 第五版说,只有指针和引用调用虚函数时才会发生动态绑定(多态)。实践一下,发现引用有的时候不能发生多态绑定(多态)。 下面的例子,父类是Quote,在Quote里定义了一个虚函数debug,用来打印出各自成员的值。2个子类Bul …


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

问题: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

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

本人微信:xiaoshitou5854

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/605707.html

(0)
上一篇 2021年5月13日
下一篇 2021年5月13日

精彩推荐