Больше информации о "не может создать экземпляр абстрактного класса" - PullRequest
2 голосов
/ 09 июня 2011

Иногда я работаю с относительно сложными (и иногда путающими - с тем, как они изложены теми, кто написал это изначально) абстрактными классами.При наследовании от него я иногда сталкиваюсь с cannot instantiate abstract class, и большую часть времени это происходит потому, что я забыл объявить и реализовать чисто виртуальную функцию.Могу ли я получить больше информации от компилятора о том, какую функцию он не реализовал вместо того, чтобы охотиться за ней?

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

Вы используете Visual Studio? Если это так, перейдите с вкладки Список ошибок на вкладку Вывод. Там будет что-то вроде:

main.cpp(8): error C2259: 'foo' : cannot instantiate abstract class
          due to following members:
          'void Foo::method(char)' : is abstract
2 голосов
/ 09 июня 2011

Всякий раз, когда вы сталкиваетесь с этим сообщением, это сразу означает, что вы не определили функцию pure virtual в производном классе и хотите создать ее экземпляр. И если вы используете хороший компилятор, то, я уверен, он указывает, какую pure virtual функцию вы не реализовали. По крайней мере, GCC указывает на это.

См. Сообщение об ошибке здесь: http://www.ideone.com/83iDk

prog.cpp: в функции int main ():
prog.cpp: 11: ошибка: невозможно объявить переменную "a" абстрактного типа "A"
prog.cpp: 6: note: потому что следующие виртуальные функции являются чистыми в «A»:
prog.cpp: 7: примечание: виртуальная пустота A :: f ()

Этого более чем достаточно, чтобы вы не реализовали A::f().

...