文章 "在 MQL5 中使用对象指针" - 页 4

 
tol64:
发现安全漏洞了吗?)
是的,这样直接施放是不道德的。在 pluses 中,有专门用于此目的的 dynamic_cast,但在这里,你无法完全正确地进行投递,而且这可能会导致隐含的严重错误。就严重性而言,它并不比不安全的指针和引用好多少。
 
denkir:

使用多态性 不是更好吗?

大约是这样:

问题是继承类CChartObjectRectLabelCChartObjectButtonCChartObjectEdit 都有自己独特的方法需要访问。而标准库中的基类CChartObject 并没有相同的虚拟方法。

 

在我上面的例子中...

访问 继承类的方法


......结果是这样的

//--- 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());
 
TheXpert:
是啊这样直接施放是非正统的。在 pluses 中,有专门用于此目的的dynamic_cast,而在这里,你无法完全正确地投递它,而且它是隐含和严重错误的潜在来源。严重的是,它并不比不安全的指针和引用好多少。

是的,在论坛上提问之前,我在网上发现 C++ 有dynamic_cast 操作符(一种动态数据 识别机制)。

现在我看到了上面的链接:

// 动态数据类型识别机制只适用于多态数据类型 
// 类(即至少包含一个虚拟成员函数的类) // 类

所以这是一个强制性条件?如果基类中没有虚拟方法,那么dynamic_cast 就不起作用?

附注: >>> 我正在阅读有关dynamic_cast 的更多信息(MSDN)。

 
TheXpert:
妈的,说完这个还谈语言安全?

你可能认为,你可以像在 C/C++ 中一样自由地使用任何语言。

事实并非如此,安全性并没有错。

 
Renat:

您可能认为,您可以像在 C/C++ 中一样自由地将数据投向任何对象。

但事实并非如此,安全方面也没有任何问题。

我无意中发现了这个错误,这似乎证实了你的话。)

2014.11.06 14:33:36.588 OOP_Test (EURCHF,M5)   incorrect casting of pointers in 'Test1.mqh' (931,13)
 
Renat:

不是的,安全性没有问题。

不,通常不能在编译时进行 dynamic_cast 检查。
 
TheXpert:
不,在编译时无法正确检查 dynamic_cast。

上面的注释显示了在rantime 中进行铸造检查的结果。

它非常严谨,在 RTTI 机制中也能正常工作,因为在出现幽灵的情况下,我们可以清楚地知道谁是谁

 
Renat:

上面的注释显示了rantime 中的铸造检查结果。

Oops....糊涂了。我还以为是编译器。那我就收回来。
 
教程让我清楚地了解了多态性。谢谢