class item_base
{
public:
item_base(const string& str = "",double nprice = 0.0 ):isbn(str),price(nprice){}
~item_base(){}
virtual int count_price( int count ){ cout<< (count*price) << endl; return count*price ;}
virtual item_base* clone(){ return new item_base(*this); }
protected:
string isbn;
double price;
};
class bulk_item:public item_base
{
public:
//派生类成员的初始化
bulk_item(const string& str,double nPrice,double ndiscount =0.1):item_base(str,nPrice),discount( ndiscount ){}
int count_price( int count )
{
if ( count>100 )
{
cout<< count*(1-discount)*price <<endl;
return count*(1-discount)*price;
}
}
bulk_item* clone() { return new bulk_item(*this) ;}
private:
double discount;
};
class sales_item
{
public:
sales_item(item_base& item):p (item.clone()),use( new size_t(1)){}
~sales_item(){ desc_sales();}
sales_item(const sales_item& item): p(item.p),use(item.use){ ++*use;}
sales_item& operator = (const sales_item& i);
item_base* operator ->()
{
if (p)
{
return p;
}
}
private:
item_base* p;
size_t* use;
void desc_sales(){ if( --*use == 0) delete p;delete use;}
};
inline sales_item& sales_item::operator =(const sales_item & i)
{
++*(i.use);
desc_sales();
p = i.p;
use = i.use;
return *this;
}
//代码过程中产生的问题
//1、函数前忘记加public,默认private的了。
//2、clone()函数忘记加virtual,导致生成的类指针不对,因为不是虚函数,item_base的引用直接就在item_base类中查找函数,不在
//去动态绑定,所以产生错误。
//因为是成员函数访问私有成员,没有问题。
void main()
{
item_base tempitem("hello",100);
bulk_item tempbulk("word",100);
sales_item item1(tempitem);
sales_item item2(tempbulk);
item1->count_price(150);
cout<<"------------------"<<endl;
item2->count_price(150);
}