我正在我的应用程序中编写GL效果系统,所以我有一个名为
的超类cEffect - 处理每个效果的加载/解析配置文件
和其他继承的classess
CFX < 名称> - 对于我添加的每个效果(模糊,绽放,混乱......)。
这里简化了代码,但看起来像这样:
Class cEffect
{
public:
bool ParseString(...);
private:
int m_nStartFrame;
int m_nEndFrame;
float m_fSpeed;
};
// Blur effect
Class cFXBlur : public cEffect
{
public:
bool RenderFrame(...);
};
// Bloom effect
Class cFXBloom : public cEffect
{
public:
bool RenderFrame(...);
};
// Scene drawing effect
Class cFXScene : public cEffect
{
public:
bool RenderFrame(...);
};
// Clear the depth/color buffer
Class cFXClearBuffers : public cEffect
{
public
bool RenderFrame(...);
}
现在,演示引擎处理
std::vector<cEffect *> m_pvEffects;
添加了效果列表的矢量。 并且当效果添加到当前时间时(假设我添加模糊) 我添加它像:
// Blur to be added
cEffect *newEffect = new cFXBlur;
newEffect->SetStartTime(x);
newEffect->SetEndTime(y);
newEffect->SetPower(13.0f);
newEffect->SetTexture(...);
// Now add the effect to the effects list.
m_pvEffects.push_back(newEffect);
现在,当我渲染i遍历m_pvEffects列表时 - 我也想调用 RenderFrame方法(在每个 CFX &lt; 名称&gt;效果中都是公开的)。
(*it)->RenderFrame(...)
但是编译器说:
错误C2039:'RenderFrame':不是'CEffect'的成员
我有点理解它为什么会发生但却无法想到如何解决这个问题, 你能帮帮我吗 - 似乎我失去了情节...
感谢您提出任何建议,如何将 CFX 添加到 cEffect 矢量以及稍后 使用 - &gt; RenderFrame 方法?
答案 0 :(得分:1)
发生错误,因为cEffect
没有名为RenderFrame
的成员函数。你想要的是一个虚函数,一个面向对象编程的基本概念。基本上你需要添加一个函数
virtual bool RenderFrame(...);
到您的cEffect
定义。 virtual
关键字基本上告诉编译器在运行时解析它。这意味着如果您在cEffect
指针或引用上调用此方法,则会调用此指针或引用指向的具体派生类的相应方法。在这种情况下,您还应该在所有派生类中将该方法声明为虚拟(虽然这不是必需的,但它会使您的代码更清晰。)
如果您不希望基类方法执行任何操作,并且您希望要求所有派生类使用它们自己的实现覆盖它,那么您可以将此方法设置为基类中的纯虚拟方法,方法是将其作为
virtual bool RenderFrame(...) = 0;
这基本上告诉编译器,这是一个抽象方法,它没有具体的实现,只能由派生类实现。
这是一个非常简化的解释(对每个认为我的措辞不完全准确的专家都有用)。您应该阅读更多关于面向对象编程的材料,特别是与C ++结合使用。
答案 1 :(得分:1)
您应该将班级cEffect更改为:
Class cEffect
{
public:
bool ParseString(...);
virtual bool RenderFrame(...) = 0;
private:
int m_nStartFrame;
int m_nEndFrame;
float m_fSpeed;
};
如果要在子类中重新定义方法,则需要关键字virtual
。 = 0
使类cEffect
成为抽象(即,您无法直接创建cEffect类型的对象),因此子类必须实现方法RenderFrame(...)