1. 程式人生 > >c/c++ 繼承與多型 引用有的時候並不能達到多型的效果

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