#include <iostream>
#include <string>
using namespace std;
class Item_base
{
public:
//int x;
Item_base(const string &book = "", double sales_price = 0.0) : isbn(book),price(sales_price){}
string book() const // 这里是为了显示isbn,
{
return isbn;
}
virtual double net_price(size_t n) const // 这里是定义成一个虚函数”virtual“,
{
return n * price;
}
private:
string isbn;
protected: // 这是受保护的成员,专门用于继承的,
double price; //
};
class Bulk_item : public Item_base // 可以继承Item_base的公有部分以及专门用于继承的,
{
public:
Bulk_item(const string &book = "",double sales_price = 0.0,size_t qty = 0, double disc_rate = 0.0)
: Item_base(book,sales_price),min_qty(qty),discount(disc_rate) {}
void test()
{
cout << price << endl;
}
void test2(const Bulk_item &d,const Item_base &e)
{
cout << d.price << endl;
}
double net_price(size_t cnt) const // 这里是继承了一个函数,被集成的函数必须是虚函数,
{
if(cnt > min_qty)
return cnt * (1 - discount) * price;
else
return cnt * price;
}
private:
size_t min_qty;
double discount;
};
void print_total_1(ostream &os, const Item_base item, size_t n)
{
os << "ISBN:" << item.book() << "\t number sold: " << n << "\t total_price:" << item.net_price(n) << endl;
}
void print_total_2(ostream &os, const Item_base *item, size_t n)
{
os << "ISBN:" << item->book() << "\t number sold: " << n << "\t total_price:" << item->net_price(n) << endl;
}
void print_total_3(ostream &os, const Item_base &item, size_t n)
{
os << "ISBN:" << item.book() << "\t number sold: " << n << "\t total_price:" << item.net_price(n) << endl;
}
int main()
{
Item_base a("0-12-3",6.6);
Bulk_item b("0-12-3",6.6,200,0.5);
print_total_1(cout,a,10);
print_total_1(cout,b,10); // 这是对象转换,对象转换有问题,这是把派生类转换成基类,
cout << endl;
print_total_2(cout,&a,10);
print_total_2(cout,&b,200); // 指针转换,没有问题 这是把派生类转换成基类,
cout << endl;
print_total_3(cout,a,10); // 引用转换,没有问题 这是把派生类转换成基类,
print_total_3(cout,b,200);
cout << endl;
Bulk_item *p = static_cast<Bulk_item *>(&a); // 这是将基类强制转换成派生类,这个从来就不用,
cout << p->net_price(10) << endl;
return 0;
}