Errori, bug, domande - pagina 2327

 
Alexey Navoykov:

Perché MQL non ha risolto il bug per cui una classe base viene implicitamente castata in una classe derivata? Nemmeno un avvertimento del compilatore!

Deve essere a causa di questo costrutto corretto

class A {  };

class B : public A { };

A* a;

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

non è stato preso in considerazione.

 
fxsaber:

Probabilmente a causa di questo design corretto

non ha tenuto conto del suo.

Questa è esattamente la stessa costruzione errata.
 
Alexey Navoykov:
È esattamente la stessa costruzione errata.

Se c'è un oggetto della classe derivata dietro il puntatore alla classe base, questa è una costruzione meravigliosa.

 
fxsaber:

Se c'è un oggetto della classe derivata dietro il puntatore alla classe base, questo è un ottimo design.

Vi suggerisco di non discutere e di credermi che si tratta di un errore.
 
Alexey Navoykov:
Vi suggerisco di non discutere, ma solo di credere che è un errore.

Questo verbo è debolmente applicabile in un forum tecnico. Provato con 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]

Nessuna delle opzioni ha funzionato. Le ragioni non sono chiare.

 
Koldun Zloy:

Se li rendete intercambiabili, allora sono entrambi inutili.

In C++, questo è possibile:

Ho suggerito la variante più semplice che potrebbe essere implementata domani (e non tra 10 anni) e sarebbe esternamente simile al C++ (altrimenti perché cambiare qualcosa). Inoltre, se operator*() non è e non sarà implementato (c'erano informazioni al riguardo sul forum), non è chiaro perché operator->() dovrebbe essere improvvisamente implementato (sono dello stesso ordine).

 
Alexey Navoykov:

Perché MQL non ha risolto il bug per cui una classe base è implicitamente castata in una classe derivata? Nemmeno un avvertimento del compilatore!

Stai aspettando un errore di compilazione? Non dovrebbe essercene uno, perché in questo caso è dynamic_cast
 
TheXpert:
Stai aspettando un errore di compilazione? Non dovrebbe essercene uno, perché in questo caso è dynamic_cast
Vedi sopra, fxsaber ha fornito il codice C++.
 
Alexey Navoykov:
Vedi sopra, fxsaber ha fornito il codice C++.

compilato da

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:

compilato da

Non stai prestando attenzione.