2011-12-29 78 views
1

我的編譯器說:公共繼承類不能訪問重載的非虛擬基類的公共方法?

error C2660: 'UberMaterial::Initialize' : function does not take 2 arguments 

當我寫這篇文章:

#include "BaseMaterial.h" 
#include "UberMaterial.h" 

UberMaterial* m_pGameLevelMaterial; 
m_pGameLevelMaterial->Initialize(m_pContentManager, m_pLevel->GetDevice()); 

的基類:

class BaseMaterial 
{ 
public: 
BaseMaterial(tstring shaderFilename); 
virtual ~BaseMaterial(){} 

void Initialize(ContentManager *pContentManager, ID3D10Device *pD3DDevice); 
//[More Code...] 

protected: 
    virtual void Initialize(ContentManager *pContentManager) = 0; 
//[More Code...] 
}; 

繼承的類:

#include "BaseMaterial.h" 
class UberMaterial:public BaseMaterial 
{ 
//[More Code...] 
protected: 
    virtual void Initialize(ContentManager *pContentManager); 
//[More Code...] 
}; 

誰能告訴我問題是什麼?

如果您需要更多的代碼,只需評論,我會發布它。但是整件事情相當大,所以我現在沒有包含它。

回答

4

是的,默認情況下,派生類中的重載將隱藏與基類不同的重載。與using您可以重新暴露基類的重載:

class UberMaterial : public BaseMaterial 
{ 
    ... 

public: 
    using BaseMaterial::Initialize; 

    virtual void Initialize(ContentManager *pContentManager); 
}; 
+0

因爲該方法是在基類重載我使用的是虛擬的,我想,要通過多態性其他代碼訪問重載方法。 我不確定我是否理解你的答案。通過在那裏使用'BaseMaterial :: Initialize',我將能夠訪問基類的方法? – xcrypt 2011-12-29 00:31:54

+0

Ah nvm自我上次編輯以來我明白了。但是一個'using'聲明在一個類中做了什麼?順便說一句,我也可以通過輸入'm_pGameLevelMaterial-> BaseMaterial :: Initialize(m_pContentManager,m_pLevel-> GetDevice())來訪問它;' – xcrypt 2011-12-29 00:35:29

+0

@xcrypt:'using'會將基礎成員帶入範圍,否則它將被隱藏。 – ildjarn 2011-12-29 01:27:17