Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Win32/C++;类继承问题_Windows_Class - Fatal编程技术网

Windows Win32/C++;类继承问题

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; };

我正在我的应用程序中编写一个GL效果系统,因此我有一个名为

cefect-处理每个效果的加载/解析配置文件

和其他继承的阶级

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;
现在,当我渲染时,我会遍历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;
};