文章 "在 MQL5 中使用对象指针" - 页 4 12345 新评论 TheXpert 2014.11.06 08:57 #31 tol64: 发现安全漏洞了吗?) 是的,这样直接施放是不道德的。在 pluses 中,有专门用于此目的的 dynamic_cast,但在这里,你无法完全正确地进行投递,而且这可能会导致隐含的严重错误。就严重性而言,它并不比不安全的指针和引用好多少。 Anatoli Kazharski 2014.11.06 08:58 #32 denkir:使用多态性 不是更好吗?大约是这样:问题是继承类CChartObjectRectLabel、CChartObjectButton 和CChartObjectEdit 都有自己独特的方法需要访问。而标准库中的基类CChartObject 并没有相同的虚拟方法。 Anatoli Kazharski 2014.11.06 09:04 #33 在我上面的例子中... 访问 继承类的方法?......结果是这样的//--- objects[0].// 如何访问 CChartObjectEdit 类的方法? // 1. Print("((CChartObjectEdit *)objects[0]).BackColor(): ",((CChartObjectEdit *)objects[0]).BackColor()); //--- 2. CChartObjectEdit *e=(CChartObjectEdit *)objects[0]; Print("e.BackColor(): ",e.BackColor()); //--- objects[1].// 如何访问 CChartObjectButton 类的方法? // 1. Print("((CChartObjectButton *)objects[1]).State(): ",((CChartObjectButton *)objects[1]).State()); //--- 2. CChartObjectButton *b=(CChartObjectButton *)objects[1]; Print("b.State(): ",b.State()); //--- objects[2].// 如何访问 CChartObjectRectLabel 类的方法? // 1. Print("((CChartObjectRectLabel *)objects[2]).BackColor(): ",((CChartObjectRectLabel *)objects[2]).BackColor()); //--- 2. CChartObjectRectLabel *r=(CChartObjectRectLabel *)objects[2]; Print("r.BackColor(): ",r.BackColor()); Anatoli Kazharski 2014.11.06 09:24 #34 TheXpert: 是啊这样直接施放是非正统的。在 pluses 中,有专门用于此目的的dynamic_cast,而在这里,你无法完全正确地投递它,而且它是隐含和严重错误的潜在来源。严重的是,它并不比不安全的指针和引用好多少。是的,在论坛上提问之前,我在网上发现 C++ 有dynamic_cast 操作符(一种动态数据 识别机制)。现在我看到了上面的链接:// 动态数据类型识别机制只适用于多态数据类型 // 类(即至少包含一个虚拟成员函数的类) // 类所以这是一个强制性条件?如果基类中没有虚拟方法,那么dynamic_cast 就不起作用?附注: >>> 我正在阅读有关dynamic_cast 的更多信息(MSDN)。 Renat Fatkhullin 2014.11.06 09:55 #35 TheXpert: 妈的,说完这个还谈语言安全?你可能认为,你可以像在 C/C++ 中一样自由地使用任何语言。事实并非如此,安全性并没有错。 Anatoli Kazharski 2014.11.06 12:41 #36 Renat:您可能认为,您可以像在 C/C++ 中一样自由地将数据投向任何对象。但事实并非如此,安全方面也没有任何问题。我无意中发现了这个错误,这似乎证实了你的话。)2014.11.06 14:33:36.588 OOP_Test (EURCHF,M5) incorrect casting of pointers in 'Test1.mqh' (931,13) TheXpert 2014.11.06 14:36 #37 Renat:不是的,安全性没有问题。 不,通常不能在编译时进行 dynamic_cast 检查。 Renat Fatkhullin 2014.11.06 14:48 #38 TheXpert: 不,在编译时无法正确检查 dynamic_cast。上面的注释显示了在rantime 中进行铸造检查的结果。它非常严谨,在 RTTI 机制中也能正常工作,因为在出现幽灵的情况下,我们可以清楚地知道谁是谁。 TheXpert 2014.11.06 17:07 #39 Renat:上面的注释显示了rantime 中的铸造检查结果。 Oops....糊涂了。我还以为是编译器。那我就收回来。 alwaysmlie4u 2018.09.21 03:06 #40 教程让我清楚地了解了多态性。谢谢 12345 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
发现安全漏洞了吗?)
使用多态性 不是更好吗?
大约是这样:
问题是继承类CChartObjectRectLabel、CChartObjectButton 和CChartObjectEdit 都有自己独特的方法需要访问。而标准库中的基类CChartObject 并没有相同的虚拟方法。
在我上面的例子中...
访问 继承类的方法?
......结果是这样的
是啊这样直接施放是非正统的。在 pluses 中,有专门用于此目的的dynamic_cast,而在这里,你无法完全正确地投递它,而且它是隐含和严重错误的潜在来源。严重的是,它并不比不安全的指针和引用好多少。
是的,在论坛上提问之前,我在网上发现 C++ 有dynamic_cast 操作符(一种动态数据 识别机制)。
现在我看到了上面的链接:
所以这是一个强制性条件?如果基类中没有虚拟方法,那么dynamic_cast 就不起作用?
附注: >>> 我正在阅读有关dynamic_cast 的更多信息(MSDN)。
妈的,说完这个还谈语言安全?
你可能认为,你可以像在 C/C++ 中一样自由地使用任何语言。
事实并非如此,安全性并没有错。
您可能认为,您可以像在 C/C++ 中一样自由地将数据投向任何对象。
但事实并非如此,安全方面也没有任何问题。
我无意中发现了这个错误,这似乎证实了你的话。)
不是的,安全性没有问题。
不,在编译时无法正确检查 dynamic_cast。
上面的注释显示了在rantime 中进行铸造检查的结果。
它非常严谨,在 RTTI 机制中也能正常工作,因为在出现幽灵的情况下,我们可以清楚地知道谁是谁。
上面的注释显示了rantime 中的铸造检查结果。