Windows Win32/C++;类继承问题
我正在我的应用程序中编写一个GL效果系统,因此我有一个名为 cefect-处理每个效果的加载/解析配置文件 和其他继承的阶级 cFX-对于我添加的每一种效果(模糊、绽放、混乱等) 此处对代码进行了简化,但如下所示:Windows Win32/C++;类继承问题,windows,class,Windows,Class,我正在我的应用程序中编写一个GL效果系统,因此我有一个名为 cefect-处理每个效果的加载/解析配置文件 和其他继承的阶级 cFX-对于我添加的每一种效果(模糊、绽放、混乱等) 此处对代码进行了简化,但如下所示: Class cEffect { public: bool ParseString(...); private: int m_nStartFrame; int m_nEndFrame; float m_fSpeed; };
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;
现在,当我渲染时,我会遍历m_pvEffects列表,但我也想调用
渲染帧方法(在每个CFX效果中公开)
但编译器说:
错误C2039:“RenderFrame”:不是“cefect”的成员
我有点理解为什么会发生这种情况,但我真的想不出一个方法我该如何解决这个问题,
你们能帮帮我吗?好像我把情节弄丢了
感谢您的建议,我可以如何将CFX添加到cefect向量和更高版本
使用->RenderFrame方法?发生错误,因为
cefect
没有名为RenderFrame
的成员函数。您需要的是虚拟函数,这是面向对象编程的基本概念。基本上,您需要添加一个函数
virtual bool RenderFrame(...);
到您的cefect
定义。virtual
关键字基本上告诉编译器在运行时解析它。这意味着如果对cefect
指针或引用调用此方法,则调用此指针或引用点所指向的具体派生类的相应方法。在这种情况下,您还应该在所有派生类中将该方法声明为virtual(尽管这不是必需的,但它使您的代码更清晰)
如果您不希望基类方法做任何事情,并且希望所有派生类都用自己的实现覆盖它,那么您可以通过如下方式将此方法在基类中设置为纯虚拟方法
virtual bool RenderFrame(...) = 0;
这基本上告诉编译器,这是一个抽象方法,没有具体的实现,只由派生类实现
这是一个非常简单的解释(适用于所有认为我的措辞不100%准确的专家)。在面向对象程序设计中,你应该阅读更多的资料,特别是与C++的结合。 你应该把你的课堂效果改为:
Class cEffect
{
public:
bool ParseString(...);
virtual bool RenderFrame(...) = 0;
private:
int m_nStartFrame;
int m_nEndFrame;
float m_fSpeed;
};
如果要在子类中重新定义方法,则需要关键字
virtual
。=0
使类cefect
抽象(即,您不能直接创建cefect类型的对象),因此子类必须实现方法RenderFrame(…)
完美,问题解决了-我怎么会错过了这一点。。谢谢你,克里斯蒂安!谢谢bjoernz/christian-非常有用的答案!
virtual bool RenderFrame(...) = 0;
Class cEffect
{
public:
bool ParseString(...);
virtual bool RenderFrame(...) = 0;
private:
int m_nStartFrame;
int m_nEndFrame;
float m_fSpeed;
};