c/c++ 继承与多态 引用有的时候并不能达到多态的效果
程序员文章站
2022-03-17 13:55:09
继承与多态 引用有的时候并不能达到多态的效果 问题: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
本人微信:xiaoshitou5854
上一篇: 论一个程序员的自我修养-从一张图片说起
下一篇: 严肃不起来啊