Ошибки, баги, вопросы - страница 1784

 

Ошибка при выполнении: EX5 loading failed

class A;
typedef void (*f)( A*);
class A {
    virtual void g( A *a ) {}
        f ff;
};
void OnStart() { Print( __FUNCTION__ ); }
 

Ошибка при выполнении

class B;
void f( B* );
class A { public:
        virtual ~A() { f((B *)&this ); } //(*)
        virtual void g( A* ) { Print( __FUNCTION__ ); }
};
class B : public A { public:
        virtual void g( A* ) { Print( __FUNCTION__ ); }
};
void f( B *b ) { b.g( b ); }
void OnStart() //(1)
{
        B *b = new B;
        delete b;
}

Результат: incorrect casting of pointers in (*)

А если 

void OnStart() { B b; } //(2)

то результат: B::g

а в чем принципиальная разница между OnStart (1) и (2) ???

Кроме того результат подобного кода в С++: A::g


 

 

A100: 

Для чего может быть нужен виртуальный деструктор, как в Вашем примере выше? Разве его можно переопределить в потомке?

 
fxsaber:

Для чего может быть нужен виртуальный деструктор, как в Вашем примере выше? Разве его можно переопределить в потомке?

В MQL он всегда виртуальный, даже если это не указано явно
 
A100:
В MQL он всегда виртуальный, даже если это не указано явно
Так Вы на вопрос не ответили - для чего?
 
fxsaber:
Так Вы на вопрос не ответили - для чего?
Если в MQL все деструкторы виртуальные, то вопрос для чего нужен виртуальный деструктор сводится в вопросу для чего нужен деструктор? А это слишком общий вопрос
 
A100:
Если в MQL все деструкторы виртуальные, то вопрос для чего нужен виртуальный деструктор сводится в вопросу для чего нужен деструктор? А это слишком общий вопрос
Знаю, для чего нужен деструктор. Мне непонятно, для чего перед его определением прописывать слово virtual?
 
fxsaber:
Знаю, для чего нужен деструктор. Мне непонятно, для чего перед его определением прописывать слово virtual?
Приписка мне нужна для совместимости кода с С++, поскольку там деструкторы различаются
 
A100:
Приписка мне нужна для совместимости кода с С++, поскольку там деструкторы различаются
Понял, спасибо. Много портируете на MQL5? - поэтому столь специфические примеры?
 
fxsaber:
Знаю, для чего нужен деструктор. Мне непонятно, для чего перед его определением прописывать слово virtual?

Виртуальные функции и деструктор >>>

Основное правило: если у вас в классе присутствует хотя бы одна виртуальная функция, деструктор также следует сделать виртуальным. При этом не следует забывать, что деструктор по умолчанию виртуальным не будует, поэтому следует объявить его явно. Если этого не сделать, у вас в программе почти наверняка будут утечки памяти (memory leaks). Чтобы понять почему, опять же много ума не надо. Рассмотрим несколько примеров.