C++容器与继承问题,也是Primer的习题

[复制链接]
查看11 | 回复1 | 2011-8-28 03:42:18 | 显示全部楼层 |阅读模式
#include
#include
#include
#include
#include
class Item_base
{
public:
        Item_base(const std::string &book="",double sales_price=0.0)
                :isbn(book),price(sales_price){}
        std::string book() const {return isbn;}
        virtual double net_price(size_t n) const {return n*price;}
        virtual ~Item_base(){}
private:
        std::string isbn;
protected:
        double price;
};
class Disc_base:public Item_base
{
public:
        Disc_base(const std::string &book="",double sales_price=0.0,size_t qty=0,double dis=0.0)
                :Item_base(book,sales_price),quantity(qty),discount(dis){}
        std::pair discount_policy() const
        {return std::make_pair(quantity,discount);}
        virtual double net_price(size_t n) const =0 ;//定义为纯虚函数,使之成为虚基类
protected:
        size_t quantity;
        double discount;
};
class Lds_item:public Disc_base
{
public:
        Lds_item(const std::string &book="",double sales_price=0.0,size_t qty=0,double dis=0.0)
                :Disc_base(book,price,qty,dis){}
        virtual double net_price(size_t n) const;
};
double Lds_item::net_price(size_t n) const
{
        if(n >= quantity)
                return quantity*(1-discount)*price+(n-quantity)*price;
        else
                return n*price*(1-discount);
}
class Bulk_item:public Disc_base
{
public:
        Bulk_item(const std::string &book="",double sales_price=0.0,size_t qty=0,double dis=0.0)
                :Disc_base(book,price,qty,dis){}
        virtual double net_price(size_t n) const;
};
double Bulk_item::net_price(size_t n) const
{
        if(n >= quantity)
                return n*(1-discount)*price;
        else
                return n*price;
}
int main()
{
        std::vector[I] Ivec;
        std::cout>isbn>>price>>qty>>dis)
        {
                if(std::cin)
                        Ivec.push_back(Bulk_item(isbn,price,qty,dis));
                else
                {
                        std::cerrnet_price(10);
        }
        std::cout<<sum<<std::endl;
        return 0;
}
但输入01 10 5 0.5然后crtl+z输入完后,为什么sum是乱七八糟的数字,我跟踪调试了,发现Ivec中的元素price貌似没有初始化,但是isbn初始化了,这是为啥?
我又试了下,把
if(std::cin)
                        Ivec.push_back(Bulk_item(isbn,price,qty,dis));
换成了
if(std::cin)
{

Item_base IB=Bulk_item(isbn,price,qty,dis);

Ivec.push_back(IB);
}
发现是用派生类对象对基类对象赋值时,出现了问题,price并没有初始化,但是isbn初始化了,这是为什么?求高手解答下

回复

使用道具 举报

千问 | 2011-8-28 03:42:18 | 显示全部楼层
不知道你的C语言学到什么程度了 , 学习C的话,选择C PRIMER 第4版还行 。 不过学习的时候记得找到该版本的课后习题解答 ,自己结合来看效果会好一点...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行