为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
小怪兽爱吃肉 2023-04-24 18:14:41
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
查看完整描述

2 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

没什么原因,微软编译器的问题,VC9似乎可以了。换成GCC完全可以的。别太依赖某一个编译器,多尝试几个看看。

可以这样设计:
void *clone() const
{
return new Bulk_item(*this);
}
然后强制转化void *指针,但是强制转化类型就体现不出虚函数的特点了,这只是一个折衷的方法。

一楼的说也有道理的,但是你的题目给出的是复制未知类型,那样的话就不是复制未知类型了。
至于虚函数重写的返回值问题,你这种写法是对的,这是C++新标准加进去的,只不过不是所有编译器都实现了。这是一个例外:当基类虚函数返回是指针或者引用时,派生类也可以随着改变返回类型,该返回类型应该为基类返回的类或者其派生类的指针或引用。

查看完整回答
反对 回复 2023-04-27
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

你重写了base里的定义的虚函数,但是返回类型不对,这是编译器不允许的

我猜测你的意图在于返回bulk或者lds指针,但clone的原型为返回base指针,既然base里定义好了接口并且定义为虚函数,你可以将出错的地方(Bulk_item* clone()const 和 Lds_item* clone() const
)改为Base_item*clone()const,这才是多态的用法

查看完整回答
反对 回复 2023-04-27
  • 2 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信