所以,我知道很多这样的问题,但是其他答案似乎表明该应该有效,所以我想我要专门问一下我的代码。我在.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;
}
答案 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;
}
};
渲染必须是虚拟的,因此它会覆盖它
注意:虚函数是成员函数,它在基类中声明,并由派生类重新定义(重写)。当使用指针或对基类的引用来引用派生类对象时,可以为该对象调用虚拟函数并执行该派生类的函数版本。