假設我有一個基類水果和三個派生類說Apple,orange和mango.Now我想只在Apple類中定義一個成員函數「taste」。所以我該怎麼做? 是否有必要在基類中定義它,所有的派生類或者我可以只在一個所需類即蘋果定義它 我必須使用虛擬函數,該函數在派生類中定義函數
感謝和問候
假設我有一個基類水果和三個派生類說Apple,orange和mango.Now我想只在Apple類中定義一個成員函數「taste」。所以我該怎麼做? 是否有必要在基類中定義它,所有的派生類或者我可以只在一個所需類即蘋果定義它 我必須使用虛擬函數,該函數在派生類中定義函數
感謝和問候
你不不必在基類中定義它。但是,您將無法在基類指針或引用上調用此方法。該功能不需要是虛擬的。
class Fruit {};
class Apple : public Fruit
{
public:
void Taste();
}
class Orange : public Fruit {}
class Mango : public Fruit {}
Fruit* f = new Apple();
f->Taste(); // Error
Apple* a = new Apple();
a->Taste() // Ok
然而,如果你想擁有從基類指針或引用訪問方法,你需要定義一個空的實現在基類的虛方法和蘋果類中重寫它。
class Fruit
{
public:
virtual void Taste() {}
};
class Apple : public Fruit
{
public:
virtual void Taste()
{
// Do something.
}
}
class Orange : public Fruit {}
class Mango : public Fruit {}
Fruit* f = new Apple();
f->Taste(); // Ok
Fruit* f2 = new Orange();
f2->Taste(); // Ok and no side effect.
在一般設計模式中,類行爲和品質應該作爲模式添加在不同的子類中,稱爲taset。
這是鴨子一個很好的例子,這適用於你的水果,以及
http://www.cs.colorado.edu/~kena/classes/5448/f09/lectures/16-introdesignpatterns.pdf
那麼如何從衍生class.Actually調用這個方法我想呼籲基類指針,但在這個方法同時我不想將它包含在每個派生類中,由於代碼非常大,所以代碼爲 – user3374548
Apple a;一種味道();如果您將其定義爲空白,則不必在每個繼承的類中重新定義它,除非要像Apple那樣更改默認實現。看看我的第二個例子 –
水果應該是純粹的虛擬,這種感覺更好。 'virtual void Taste()= 0;' –