猿问

请问各位,这是什么原因导致的?谢谢

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* clone() const
{
return new Item_base(*this);
}
virtual ~Item_base() {}
private:
std::string isbn;
protected:
double price;
};

//保存折扣率和可实行折扣策略的数量,派生类将使用这些数据实现定价策略
class Disc_item : public Item_base
{
public:
Disc_item(const std::string& book=" ",double sales_price =0.0,size_t qty = 0,double disc_rate = 0.0):Item_base(book,sales_price),quantity(qty),discount(disc_rate) {}
double net_price(size_t) const = 0;
std::pair<size_t,double> discount_policy() const
{
return std::make_pair(quantity,discount);
}
protected:
size_t quantity; //可实行折扣策略的购买量
double discount; //折扣率
};

//批量购买折扣类
class Bulk_item : public Disc_item
{
public:
Bulk_item(const std::string& book=" ",double sales_price = 0.0,size_t qty = 0 ,double disc_rate = 0.0):Disc_item(book,sales_price,qty,disc_rate) {}
double net_price(size_t cnt) const
{
if (cnt >= quantity)
return cnt*(1-discount)*price;
else return cnt*price;
}
Bulk_item* clone() const
{
return new Bulk_item(*this);
}
};

//有限折扣率
class Lds_item : public Disc_item
{
public:
Lds_item(const std::string& book = " ",double sales_price = 0.0,size_t qty = 0,double disc_rate = 0.0) : Disc_item(book,sales_price,qty,disc_rate) {}
double net_price(size_t cnt) const
{
if (cnt <= quantity)
return cnt*(1-discount)*price;
else return cnt*price - quantity*discount*price;
}

Lds_item* clone() const
{
return new Lds_item(*this);
}
};

然而在VC++ 6.0平台上编译时,提示如下错误:
(1)error C2555: 'Bulk_item::clone' : overriding virtual function differs from 'Item_base::clone' only by return type or calling convention;
(2)error C2555: 'Lds_item::clone' : overriding virtual function differs from 'Item_base::clone' only by return type or calling convention

小怪兽爱吃肉
浏览 175回答 2
2回答

繁花如伊

没什么原因,微软编译器的问题,VC9似乎可以了。换成GCC完全可以的。别太依赖某一个编译器,多尝试几个看看。可以这样设计:void *clone() const{return new Bulk_item(*this);}然后强制转化void *指针,但是强制转化类型就体现不出虚函数的特点了,这只是一个折衷的方法。一楼的说也有道理的,但是你的题目给出的是复制未知类型,那样的话就不是复制未知类型了。至于虚函数重写的返回值问题,你这种写法是对的,这是C++新标准加进去的,只不过不是所有编译器都实现了。这是一个例外:当基类虚函数返回是指针或者引用时,派生类也可以随着改变返回类型,该返回类型应该为基类返回的类或者其派生类的指针或引用。

MMMHUHU

你重写了base里的定义的虚函数,但是返回类型不对,这是编译器不允许的我猜测你的意图在于返回bulk或者lds指针,但clone的原型为返回base指针,既然base里定义好了接口并且定义为虚函数,你可以将出错的地方(Bulk_item* clone()const 和 Lds_item* clone() const)改为Base_item*clone()const,这才是多态的用法
随时随地看视频慕课网APP
我要回答