cc26a_demo-CppPrimer_动态绑定_多态-代码示范

//多态性
    //从派生类到基类的转换
    //引用或者指针既可以指向基类对象,也可以指向派生类对象
    //只有通过引用或者指针调用虚函数才会发生动态绑定。
    //为什么定义虚的函数?可以重新定义。只有虚函数才可以重写,(基类或者派生类里面)

////动态绑定的方法,执行出来的效果,就是多态

  1 #include <iostream>//txwtech-202001
  2 #include <string>//多态,动态绑定
  3 
  4 using namespace std;//导入名称空间
  5 
  6 class Animal
  7 {
  8     //成员略
  9 };
 10 
 11 class Dog :public Animal
 12 {
 13     //成员略
 14 };
 15 class Cat :public Animal
 16 {
 17 
 18 };
 19 class Item_base
 20 {
 21 public:
 22     //int x;
 23     Item_base(const std::string &book = "",
 24         double sales_price = 0.0) :isbn(book), price(sales_price) {}//构造函数
 25     std::string book() const
 26     {
 27         return isbn;
 28     }
 29     virtual double net_price(size_t n) const//为什么定义虚的函数?可以重新定义。只有虚函数才可以重写
 30     {
 31         return n * price;
 32     }
 33 
 34 private://类的内部使用
 35     std::string isbn;
 36 protected://专门用来做继承用的
 37     double price;
 38 
 39 };
 40 class Bulk_item :public Item_base
 41 {
 42 public:
 43     Bulk_item(const std::string &book = "", double sales_price = 0.0,
 44         size_t qty = 0, double disc_rate = 0.0) :
 45         Item_base(book, sales_price), min_qty(qty), discount(disc_rate) {}
 46     void test()
 47     {
 48         //cout << x << endl;
 49         cout << price << endl;
 50         //cout << isbn << endl;
 51     }
 52     void test2(const Bulk_item &d, const Item_base &b)
 53     {
 54         //cout << d.x << endl;
 55         cout << d.price << endl;
 56         //cout << b.x << endl;
 57         //cout << b.price << endl;
 58     }
 59     double net_price(size_t cnt) const//继承函数时,这里可以重定义,继承函数
 60     {
 61         if (cnt >= min_qty)
 62             return cnt * (1 - discount)*price;
 63         else
 64             return cnt * price;
 65 
 66     }
 67 
 68 private:
 69     size_t min_qty;
 70     double discount;
 71 
 72 };
 73 //做一个函数
 74 void print_total(ostream &os, Item_base *item, size_t n)
 75 {
 76     os << "ISBN: " << item->book() << "\t number sold: " << n << "\ttotal price: " << item->net_price(n) << endl;
 77     //item->net_price(n)代码就是多态的
 78 }
 79 int main()
 80 {
 81     //Animal a;
 82     //Dog d;
 83     //Cat c;
 84     //Item_base item("0-12-3456-789", 9.9);
 85     //cout << item.book() << ": " << item.net_price(10) << endl;
 86     ////cout << item.x << endl;
 87     ///*cout << item.isbn << endl;
 88     //cout << item.price << endl;*/
 89     ////cout << "hello111" << endl;
 90     //Bulk_item item2("0-12-3456-789", 9.9, 10, 0.12);
 91     ////cout << item2.x << endl;
 92     //cout << item2.book() << ": " << item2.net_price(10) << endl;
 93     //item2.test();
 94     //item2.test2(item2, item);
 95 
 96     //多态,动态绑定的实现
 97 
 98     Item_base* a = new Item_base("1-234-567-01",11.0);
 99     Bulk_item* b = new Bulk_item("1-234-567-02",22.0,2,0.05);//指向子类对象的指针
100 
101     print_total(cout,a,2);
102     print_total(cout,b,3);
103 
104     Item_base* books[5];//指针数组,5个指针
105     books[0] = new Item_base("0-123-456-01",10.0);//new 创建基类对象
106     books[1] = new Bulk_item("0-123-456-01", 20.0,6,0.05);//new 也可以指向派生类对象
107     books[2] = new Item_base("0-123-456-03", 30.0);//new 创建基类对象
108     books[3] = new Bulk_item("0-123-456-04", 40.0, 4, 0.15);//new 也可以指向派生类对象
109     books[4] = new Bulk_item("0-123-456-05", 50.0, 2, 0.18);//new 也可以指向派生类对象
110     
111     int num[5];
112     num[0] = 2;
113     num[1] = 10;
114     num[2] = 1;
115     num[3] = 5;
116     num[4] = 3;
117 
118     for (int i = 0; i < 5; i++)
119     {
120         print_total(cout,books[i],num[i]);
121         //动态绑定的方法,执行出来的效果,就是多态
122     //根据指针所指向的对象不同,指向不同的对象,对象去调用不同的虚函数。有可能是基类,有可能是
123     //派生类的。
124     }
125     //分别调用基类的netprice与派生类的Netprice. netprice就是多态,根据对象决定(基类不打折,派生类打折)
126     //比如飞机在飞,鸟儿也在非,不同的飞
127     
128     
129     getchar();
130     return 0;
131 
132     //多态性
133     //从派生类到基类的转换
134     //引用或者指针既可以指向基类对象,也可以指向派生类对象
135     //只有通过引用或者指针调用虚函数才会发生动态绑定。
136     //为什么定义虚的函数?可以重新定义。只有虚函数才可以重写,(基类或者派生类里面)
137 }
posted @ 2020-01-14 15:49  txwtech  阅读(186)  评论(1编辑  收藏  举报