繁体   English   中英

调用 C++ 基方法而不是派生方法

[英]C++ base method called instead of derived method

所以,我知道经常有人问这样的问题,但其他答案似乎表明这应该可行,所以我想我会专门询问我的代码。 我花更多的时间在 .NET 和 Java 上,所以也许我忘记了一些东西。

我正在创建一个基本小部件和一组特定小部件(按钮、其他图形项目)。 我正在尝试遍历小部件的链接列表,我想要的是要调用该特定小部件的特定渲染方法。 下面是演示我的问题的简化代码,在我第一次调用 Render 时,调用了特定的渲染函数。 如果我将 cGeneralWidget 指针传递给调用 Render 对象的函数,则会调用基本方法。 我想,只要我发送一个指针,C++ 就足够聪明,可以知道对象的真正含义并调用重写的方法。

否则,处理基础对象集合并适当调用派生方法的正确方法是什么?

谢谢你。

class cGeneralWidget
{
public:
    void Render()
    {
        int a = 99;
    }
};

class cSpecificWidget : public cGeneralWidget
{
public:
    void Render()
    {
        int a = 99;
    }
};

void GeneralRenderingFunction(cGeneralWidget * b)
{
    b->Render();   // <-- calls the base function
}

int main(int argc, char* argv[])
{

    cSpecificWidget wd;
    wd.Render();   // <-- calls the derived function
    GeneralRenderingFunction(&wd);  

    return 0;
}

您应该使用virtual关键字在基类中定义 Render() 方法,并使用override关键字在派生类中定义 Render() 方法。 如果您不在基类实现中放置virtual关键字,则 C++ 不会将其标记为 virtual。

class cGeneralWidget
{
public:
    virtual void Render()
    {
        int a = 99;
    }
};

class cSpecificWidget : public cGeneralWidget
{
public:
    void Render() override
    {
        int a = 99;
    }
};

在你的基类中

class cGeneralWidget
{
public:
    virtual void Render()
    {
        int a = 99;
    }
};

渲染必须是虚拟的,所以它会覆盖它

注意:虚函数是在基类中声明并由派生类重新定义(覆盖)的成员函数。 当您使用指针或对基类的引用来引用派生类对象时,您可以为该对象调用虚拟函数并执行派生类的函数版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM