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++新標準加進去的,只不過不是所有編譯器都實現了。這是一個例外:當基類虛函數返回是指針或者引用時,派生類也可以隨著改變返回類型,該返回類型應該為基類返回的類或者其派生類的指針或引用。

MMMHUHU
TA貢獻1834條經驗 獲得超8個贊
你重寫了base里的定義的虛函數,但是返回類型不對,這是編譯器不允許的
我猜測你的意圖在于返回bulk或者lds指針,但clone的原型為返回base指針,既然base里定義好了接口并且定義為虛函數,你可以將出錯的地方(Bulk_item* clone()const 和 Lds_item* clone() const
)改為Base_item*clone()const,這才是多態的用法
- 2 回答
- 0 關注
- 233 瀏覽
添加回答
舉報
0/150
提交
取消