C 基本方法称为而不是派生方法

C++ base method called instead of derived method

本文关键字:方法 派生      更新时间:2023-10-16

所以,我知道这样的东西很多,但是其他答案似乎表明此应该有效,所以我想我会问我我的代码专门。我在.net和java上花费更多的时间,所以也许我忘记了一些东西。

我正在创建一个基本小部件和一组特定的小部件(按钮,其他图形项目)。我正在尝试循环浏览链接的小部件列表,而我想要的是用于调用该特定小部件的特定渲染方法。以下是简化的代码,证明了我的问题,在我第一次调用渲染时,调用了特定的渲染函数。如果我将CgeneralWidget指针传递给调用渲染对象的函数,则调用基本方法。我认为,只要我发送指针,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关键字在派生类中。如果您不将virtual关键字放在基类实现中,则C 不会将其标记为虚拟。

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

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

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