继承与多态 引用有的时候并不能达到多态的效果
问题: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
原文地址:https://www.cnblogs.com/xiaoshiwang/p/10198391.html
时间: 2024-10-26 09:30:05