错误、漏洞、问题 - 页 2327

 
Alexey Navoykov:

为什么MQL没有修复基类被隐含地投向派生类的错误? 甚至没有一个编译器警告!?

这一定是因为这个正确的构造

class A {  };

class B : public A { };

A* a;

B* b= a;  // Нет ошибки

没有被考虑在内。

 
fxsaber:

可能是由于这种正确的设计

没有考虑到你的情况。

这正是不正确的结构。
 
Alexey Navoykov:
这是完全相同的不正确结构。

如果在一个基类的指针后面有一个派生类对象,那就是一个很好的构造。

 
fxsaber:

如果在基类的指针后面有一个派生类对象,这就是一个很好的设计。

我建议你不要争论,只要相信我,这是一个错误。
 
Alexey Navoykov:
我建议你不要争论,只要相信 我,这是个错误。

这个动词在技术论坛上的适用性很弱。试过C++。

class A {  };

class B : public A { };

A* a = new B;

B* b= dynamic_cast<B*>(a); // cannot dynamic_cast ‘a’ (of type ‘class A*’) to type ‘class B*’ (source type is not polymorphic)
B* b1= a; // invalid conversion from ‘A*’ to ‘B*’ [-fpermissive]

所有的选择都不奏效。原因并不清楚。

 
Koldun Zloy:

如果你让它们可以互换,那么它们都只是不必要的。

在C++中,这是有可能的。

我提出了一个最简单的变体,它可以在明天(而不是10年后)实现,并且在外观上与C++有相似之处(否则为什么要改变任何东西)。此外,如果operator*()没有也不会被实现(论坛上有相关信息),不清楚为什么operator->()会突然被实现(它们的顺序相同)。

 
Alexey Navoykov:

为什么MQL没有修复基类被隐含地投向派生类的错误? 甚至没有一个编译器警告!?

你在等待一个编译错误吗? 不应该有,因为在这种情况下,它是dynamic_cast。
 
TheXpert:
你在等待一个编译错误吗? 不应该有,因为在这种情况下,它是dynamic_cast。
见上文,fxsaber提供了C++代码。
 
Alexey Navoykov:
见上文,fxsaber提供了C++代码。

汇编的

class A 
{ 
public:
    virtual ~A() = default; 
};

class B : public A { };

int main(void)
{
    A* a = new B;
    B* b= dynamic_cast<B*>(a);
    return 0;
}
 
TheXpert:

汇编的

你没有注意到。