Существует много статей, объясняющих, почему вы никогда не должны вызывать виртуальные функции в конструкторе и деструкторе на C ++. Посмотрите здесь здесь и здесь , чтобы узнать, что происходит за сценой во время таких вызовов.
Короче говоря, объекты строятся от базы до получен. Поэтому, когда вы пытаетесь вызвать виртуальную функцию из конструктора базового класса, переопределение из производных классов еще не произошло, поскольку производные конструкторы еще не были вызваны.
Включайте отладочные символы со своим пакетом сборки/развертывания.
В VS 2008 Express я нашел его в разделе «Свойства проекта» -> «Компиляция» -> «Дополнительные параметры компиляции».
Мое решение
Скопируйте файл pdb в ту же папку, что и исполняемый файл.
теперь я могу просматривать номер строки при запуске exe-файла .
это причина
http://msdn.microsoft.com/en-us/library/ee416588%28v=vs.85%29.aspx
В прошлом у меня возникали проблемы, когда я чувствовал необходимость развернуть файлы PDB с выпускной сборкой, чтобы отследить ошибку. Причина, как вы сказали, заключалась в том, что исключение произошло в методе, который был очень большим, и я не мог точно определить, где это происходило.
Это может быть признаком того, что метод необходимо реорганизовать в более мелкие, более гранулированные методы. Нет универсального ответа, но этот подход сослужил мне хорошую службу в краткосрочной перспективе (я часто обнаруживал ошибку во время рефакторинга) и в долгосрочной перспективе.
Просто мысль.