[英]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.