2010-08-17 4 views
0

Я создаю родительский класс, который вызывает его собственный виртуальный член. Но этот виртуальный член переопределяется дочерним классом.C++ вызов дочернего виртуального члена из родительского виртуального члена

class Parent { 
public: 
    void doSomething() { 
     doVirtual(); 
    } 
protected: 
    virtual void doVirtual() {} 
}; 

class Child : public Parent { 
protected: 
    virtual void doVirtual() {} 
}; 

Parent *c = new Child(); 
c->doSomething(); 

И скомпилировать его с Visual Studio 2008, на мой вопрос: Когда я выполнить код из IDE (начать отладку), он вызывает метод ребенка, но когда я запускаю исполняемый файл напрямую, он вызывает родительский метод. Я здесь что-то не так?

+0

VS 2010 вызывает дочерний метод (doVirtual) только в обоих режимах (как ожидалось) – Chubsdad

+0

Я получил тот же результат, что и chubsdad, VS 2010 вызывает дочерний метод только в обоих режимах. – muddybruin

+0

ОК, спасибо всем, я попробую против 2010 года. Я подозреваю, что ошибки где-то скрываются в моем коде. – flamemyst

ответ

0

Если функции ничего не делают (или делают то же самое), как вы знаете, что при непосредственном запуске исполняемого файла он вызывает родительский метод?

Имейте 2 функции на самом деле что-то другое - компилятор может «объединять» функции, если они идентичны (хотя я ожидаю, что это будет менее вероятно, что произойдет в сборке отладки).

Если этот ответ не имеет смысла, отправьте точный (copy-n-paste) компилятивный фрагмент, чтобы мы могли точно видеть, что происходит.

+0

Прошу прощения, но тот, который я поставил здесь, является простейшей формой из фактического кода. В детском методе есть код, и, чтобы убедиться, я поставил несколько std :: cout. И они вызывается, когда начинаются с отладчика (даже в режиме деблокирования), но не выполняются при запуске непосредственно из исполняемого файла (режим выпуска). Это только работа, когда я возвращаю его обратно на дочерний указатель. – flamemyst

+0

Прошу прощения, я не могу свести его к простому делу или воспроизвести его неправильное поведение в другом проекте, возможно, ошибка в моем коде. – flamemyst

+1

@ user422420: Я бы предложил попробовать полностью очистить ваш промежуточный результат (включая предварительно скомпилированные заголовки) и перестроить, чтобы узнать, помогает ли это вообще. –

Смежные вопросы