错误、漏洞、问题 - 页 1890

 
fxsaber:
什么是执行错误

这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。

你不能和C++比较--在那里任何东西都可以被还原成任何东西。

 
Комбинатор:
在C++中,也只有当一个基类的指针指向它的子类时,它才能发挥作用。

我不知道你说的是什么意思,但这个代码。

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

int main() {
  CLASS1 _object;
  CLASS2 *_ptr = (CLASS2*)&_object;  
  _ptr->i = 1;

   return 0;
}

在C++中工作,这就是我上面写的。这里是同样的代码(考虑到MQL语法)。

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

int OnInit() {
  CLASS1 _object;
  CLASS2 *_ptr = dynamic_cast<CLASS2 *>(&_object);
  
  _ptr.i = 1;

   return 0;
}
不再起作用,因为_ptr 得到NULL
这就引出了一个问题,这是否是MQL的一个错误,它是否会被修复,还是会一直这样?
 
Renat Fatkhullin:

这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。

你不能和C++比较--在那里任何东西都可以被还原成任何东西。


现在明白了,谢谢你的澄清 ))
 
Konstantin:

我不知道你说的是什么意思,但这个代码。

好吧,试着去理解它。首先,让dynamic_cast在正数中工作。如果你自己搞清楚,你会好得多。
 
Renat Fatkhullin:

这是正确的,你不能从下往上开,只能从上往下开。

你的意思是,你不能从一个基类被投到一个子类?
 
Комбинатор:
你的意思是你不能从基类投向子类?

是的,在基类没有实际构造的后裔的情况下。

 
Renat Fatkhullin:

这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。

如果我们把指针从上到下,也就是带到父代,然后把指针传到作用域中的其他地方,那么子代的字段在那里是否可用?
 
Renat Fatkhullin:

是的。

Renate,你知道什么是dynamic_cast吗?
 
Комбинатор:
Renat,你知道什么是dynamic_cast吗?

当然了。

看看所讨论的这段MQL5代码。一个基础实例被创建,然后它英勇地试图通过动态广播转换为子代,这违反了安全性。嗯,这当然是个无奈之举。

 

同样的例子在文件中也有直接的讨论和解释。只有在安全检查和转换允许性检查通过后,才会在运行时触发动态铸造。每个MQL5对象都有所有的元信息,以便在运行时检查权限。这不是空洞的C++。


使用dynamic_cast操作符的动态类型转换

使用dynamic_cast操作符可以动态地投掷类型,它只能应用于类指针。在这种情况下,类型的正确性检查是在程序执行的时刻进行的。这意味着当使用dynamic_cast操作符时,编译器并不检查用于转换的数据类型。如果将一个指针转换为一个数据类型,而这个类型不是实际的对象类型,那么结果将是NULL。

dynamic_cast<type-id> ( expression )

角括号中的 type-id 参数 必须是一个指向先前定义的类类型的 指针。表达式操作数类型 (相对于C++而言)可以是任何东西,除了void

例子。

class CBar { };
class CFoo :public CBar { };

空白OnStart()
{
CBar酒吧
//---- 允许将指针类型*bar动态转换为指针*foo
CFoo *foo =dynamic_cast<CFoo*>(&bar);//---没有执行的关键错误
Print(foo);// foo=NULL

foo=(CFoo *)&bar。// 将发生一个关键的执行错误
Print(foo);// 这一行将不会被执行
}