比方說,我有一個類動物和一個繼承動物的階級狗。假設我想調用一個名爲'eat()'的方法,這個方法特定於狗,但是所有動物之間都有一些共享的代碼,所以我知道我可以使'eat()'虛擬,但是它不會使用基類代碼,例如,我是否應該調用基類「eatAll()」,然後每個特定動物的吃法都必須調用它?我只是在尋找最好的設計。這是在C++我該如何使用繼承的方法和相同的基類方法?
回答
這是經典的template method pattern。基本上:
class Animal
{
void Eat()
{
//stuff specific to all animals
SpecificEat();
}
virtual void SpecificEat() = 0;
};
class Dog : Animal
{
virtual void SpecificEat()
{
//stuff specific to dog
}
};
使用此方法,您不必在派生類的覆蓋中顯式調用基類方法。它由非virtual
Eat()
自動調用,具體功能由virtual SpecificEat()
實現。
只需調用基類的方法。
class Dog : public Animal
{
public :
void Eat()
{
// .. MAGIC
Animal::Eat();
}
};
請注意,如果你的動物類的Eat
方法是純虛(我懷疑),這不會鏈接。
更好 - 編輯。 –
我已經在我的問題中提到過,我可以從狗身上調用基本方法,而問題更多的是針對能夠備份好設計的人。 「魔術」不是我正在尋找的 – Pittfall
*不會鏈接。 :) –
我會建議你的基類接口有掛鉤來調用派生類型的特定功能。這就是所謂的template method pattern.下面是一個例子:
class Animal
{
public:
void eat()
{
std::cout << "Mmmm... It's ";
do_eat();
}
private:
virtual void do_eat() = 0;
};
class Dog
: public Animal
{
virtual void do_eat()
{
std::cout << "Dog Food!\n";
}
};
class Human
: public Animal
{
virtual void do_eat()
{
std::cout << "Pizza!\n";
}
};
編輯,謝謝:) – Chad
- 1. 繼承和基類方法調用python
- 2. 如何使基類方法的屬性適用於繼承類?
- 3. 如何通過調用基類的相同方法來調用繼承類的方法?
- 4. C# - 如何使方法只對繼承方法的基類的類可見
- 5. C++繼承,如何在基類的方法中調用子類的方法?
- 6. 如何從VBA中的繼承類調用基類的方法?
- 7. Java繼承 - 使用相同方法的兩個類
- 8. 繼承相同的方法實現
- 9. python繼承 - 引用基類方法
- 10. 多個超類的多繼承,C++和相同方法簽名
- 11. Javascript的繼承和同名的方法
- 12. 如何覆蓋繼承類的方法
- 13. 方法調用繼承類
- 14. 引用類繼承方法
- 15. 使用從繼承類到基類的方法
- 16. 繼承和方法
- 17. 如何從繼承類調用方法
- 18. 如何用泛型方法繼承類?
- 19. 許多具有相同方法的類或具有該方法且由其他類繼承的類?
- 20. 如何從二級繼承類調用基類方法?
- 21. 如何使用繼承的方法更改繼承的數組?
- 22. 使用C#中繼承相同屬性的接口的方法
- 23. PHP類的繼承和擴展方法
- 24. python類的方法和繼承
- 25. C#繼承防止基類的方法調用派生類的方法
- 26. 繼承和方法調用
- 27. 方法繼承和調用
- 28. Python中的多繼承,成熟類中的相同方法
- 29. 我如何正確地繼承和隱藏基方法
- 30. Ruby類的方法繼承,如何阻止子方法執行?
可能重複:http://stackoverflow.com/questions/672373/can-i-call-a-base-classs-virtual-function-if-im-重寫 - 它 – KCH