2013-01-20 146 views
4
class subscriber 
{ 
public: 
     virtual void update() = 0; 
} 

class entity : public subsriber 
{ 
public: 
     virtual void update() = 0; 
} 

class myObject : public entity 
{ 
public: 
     virtual void update() 
     { 
     do_things(); 
     } 
} 

subscriber * ptr = new myObject; //will use shared_ptr, but here i want simplicity 

    ptr->update(); 

問題是,是否會調用正確的更新函數(在myObject中實現的函數)?在一個「家庭」中有兩個具有相同名稱的純虛函數是否有效?抽象類繼承具有相同函數名稱的另一個抽象類

+0

你爲什麼要這樣做?當然,只有一種抽象方法可以做到這一點。 – antonijn

+0

@Antonie Blom我有發佈/訂閱模式,每個實體都是訂戶。有2個函數,因爲存在從存儲已發佈消息(如果有新消息)的對象調用(使用訂閱者*)的更新,並且從實體管理器調用更新(使用enity *)。 – user1873947

+0

當你檢查你的編譯器的行爲時發生了什麼?應該很容易在你的編譯器上檢查這種行爲,不是嗎? –

回答

5

會調用正確的更新函數(在myObject中實現的函數)嗎?

是的,它會被調用。

在一個「家族」中有兩個具有相同名稱的純虛函數是否有效?

第二個聲明(即entity類的內部)不引入第二純虛函數進入家庭:簽名是相同的,所以update()是一個單一的虛擬功能。此外,第二次聲明不是必需的:即使您刪除了第二個聲明,entity仍然是抽象的,並且可以訪問update()方法。

+0

這個答案一直很好,直到不必要的*即使它出現在兩個地方,它也只會保留一個vtable插槽。向上?你不需要這樣解釋OP,只有一個功能被過度使用,是嗎? –

+1

@AlokSave我可以去任何一種方式。對我來說,使用vtable更容易看出虛擬功能會發生什麼,但我同意每個人都可能不一樣。 – dasblinkenlight

+0

另外,從技術上講,可能沒有一個從一開始的vtable :)因此,我的反對意見。 –

1

虛擬函數或虛擬方法是一種函數或方法,其行爲可以通過具有相同簽名的函數在繼承類中重寫。

所以答案是是的