2011-12-29 47 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

相关问题