[с++] абстрактный базовы класс

xoki87

я в с++ пока новичок, не понятен следующий момент. Экземпляр абстрактного базового класса не создается, хотя сам класс наследуется. что же происходит в производном класе? как работают конструкторы Абстрактногго базового класса

Serab

ты его не можешь создавать при помощи new, а так экземпляры внутри производных нормально создаются. Сам подумай, чем добавление функции virtual foo = 0; мешает работе класса? Да ничем, главное не вызывать эту функцию. А если мы создаем в итоге не абстрактный класс, то ее уже можно вызывать и никаких проблем, соответственно, нету.

xoki87

то есть внутри производногго класса абстрактный базовый класс, то есть те элементы данных которые ему соответствуют - создаются, и те функции, что не чисто виртуальные - могут вызываться элементами базового класса?

Serab

чисто виртуальные тоже могут, иначе в них было бы мало смысла. Главное понять, что экземпляры абстрактного класса существуют только в виде частей неабстрактных классов, а там все чистые виртуальные функции уже определены.
Единственный момент здесь вот в чем: виртуальные функции начинают правильно работать только после вызова соответствующего конструктора, поэтому да, чистые виртуальные функции нельзя вызывать из конструктора базового класса (да и вообще, любые виртуальные функции, они неправильно работают, т.е. не работает полиморфизм, а в случае чистых виртуальных функций вообще UB).
То же самое и к деструкторам относится.

xoki87

спасибо за помощь, помог разобраться

agaaaa

чисто виртуальные тоже могут
Вопрос, вероятно, был всё-таки о том, могут ли чисто виртуальные функции вызываться из конструктора абстрактного класса.
В таком случае правильный ответ - нет. Вернее, подобное поведение не определено в стандарте.

Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call ... to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined.

Serab

зачем ты это написал?

agaaaa

зачем ты это написал?
Решил, что это - важная деталь, которую автор темы желал бы узнать

Serab

а ты заметил, что я об этом написал в том же сообщении, и даже в более полном объеме? (в частности, напомнил еще и о деструкторе)

matvey61

как все же хорошо в FORTRAN и C без абстрактных классов и виртуальных функций.
Оставить комментарий
Имя или ник:
Комментарий: