繼承與多態 引用有的時候並不能達到多態的效果 問題: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