Win32 / C ++类继承问题

时间:2011-08-29 12:31:31

标签: windows class

我正在我的应用程序中编写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 方法?

2 个答案:

答案 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(...)