2010-11-04 50 views
1

我有一個從人形派生的Player類和仿人從雪碧派生像這樣一個問題關於繼承在我的遊戲

Sprite -> Humanoid -> Player 

到目前爲止好。 Sprite具有虛擬方法

virtual sf::Sprite getSprite() { return sprite_; } 

其中sprite是一個可以繪製到屏幕上的圖像對象。

人形聲明virtual sf::Sprite getSprite();

播放機定義virtual sf::Sprite getSprite() { return sprite_; }

的Sprite具有構件sprite_;這就是我想做的事:

1)創建一個播放器類,同時傳遞一個精靈,像這樣

Player::Player(sf::Image image) 
    : Humanoid() 
{ 
    sprite_.SetImage(image); // Converts sf::Image to sf::Sprite 
} 

2)繪製在屏幕上從我的遊戲類,像這樣

sf::Image playerImage; 
if(!playerImage.LoadFromFile("Link/Link.png")) 
    std::cin.get(); 

Player *player = new Player(playerImage); 

/* ... */ 

App.Draw(player->GetSprite()); 

測試程序,我發現player->getSprite()方法確實被調用,但我擔心我可能隱藏了Sprite::getSprite()方法,而不是實際的派生和使用它。由於Sprite類具有受保護的sprite_成員,因此我在調用函數時實際返回哪個sprite_對象時感到困惑。

此外,它似乎像圖像文件丟失沿線,並在我發佈在SFML論壇之前,我想確認我的繼承樹是否實際上是正確的。

回答

6

如果Sprite類有一個sprite_構件和無派生類(Humanoid/Player)的添加了一個部件用相同的名稱,則僅存在一個sprite_每個實例對象和作爲預期功能應該工作。我不明白你爲什麼要重寫getSprite,如果你給它完全相同的行爲。

+0

可能是因爲我不太瞭解繼承。如果我希望使用基類的虛函數,是否必須編寫聲明或定義?是否足以宣佈該功能,或者如果我未修改使用它,我可以將其保留嗎? – IAE 2010-11-04 21:07:36

+3

@SoulBeaver,如果你只想使用虛擬函數,你根本不需要聲明它,它就是在基類中定義的,你可以訪問它(假設它不是'private')。如果你改變行爲,你只想聲明和定義它。 – Motti 2010-11-04 21:10:42

+0

或者它是純虛擬的。 :) – suszterpatt 2010-11-04 21:25:54