调用C ++基本方法代替派生方法

时间:2019-03-02 18:23:22

标签: c++ inheritance

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

我正在创建一个基本窗口小部件和一组特定的窗口小部件(按钮,其他图形项)。我正在尝试遍历小部件的链表,而我想要的是要调用该特定小部件的特定渲染方法。下面是演示我的问题的简化代码,在我第一次调用Render时,将调用特定的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;
}

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

在您的基类中

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

渲染必须是虚拟的,因此它会覆盖它

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