2012-10-09 63 views
0

比方說,我有一個類動物和一個繼承動物的階級狗。假設我想調用一個名爲'eat()'的方法,這個方法特定於狗,但是所有動物之間都有一些共享的代碼,所以我知道我可以使'eat()'虛擬,但是它不會使用基類代碼,例如,我是否應該調用基類「eatAll()」,然後每個特定動物的吃法都必須調用它?我只是在尋找最好的設計。這是在C++我該如何使用繼承的方法和相同的基類方法?

+0

可能重複:http://stackoverflow.com/questions/672373/can-i-call-a-base-classs-virtual-function-if-im-重寫 - 它 – KCH

回答

5

這是經典的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 
    } 
}; 

使用此方法,您不必在派生類的覆蓋中顯式調用基類方法。它由非virtualEat()自動調用,具體功能由virtual SpecificEat()實現。

+0

快手指:) – Chad

+0

如果吃不是無效的?如果這是一個布爾例如,你如何工作? – Pittfall

+0

@Pittfall改變返回類型... –

2

只需調用基類的方法。

class Dog : public Animal 
{ 
public : 
    void Eat() 
    { 
    // .. MAGIC 
    Animal::Eat(); 
    } 
}; 

請注意,如果你的動物類的Eat方法是純虛(我懷疑),這不會鏈接。

+0

更好 - 編輯。 –

+0

我已經在我的問題中提到過,我可以從狗身上調用基本方法,而問題更多的是針對能夠備份好設計的人。 「魔術」不是我正在尋找的 – Pittfall

+0

*不會鏈接。 :) –

4

我會建議你的基類接口有掛鉤來調用派生類型的特定功能。這就是所謂的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"; 
    } 
}; 
+0

編輯,謝謝:) – Chad