c/c++ 繼承與多型 引用有的時候並不能達到多型的效果
阿新 • • 發佈:2018-12-30
繼承與多型 引用有的時候並不能達到多型的效果
問題: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