Почему мы не можем создать экземпляр абстрактного класса?

Во многих местах я обнаружил, что:

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

Но одна вещь, которая всегда бросается в глаза, почему мы не можем создать экземпляр абстрактного класса? Многие сайты в Интернете говорят, что нет смысла создавать экземпляр, или некоторые говорят, что они должны использоваться в качестве базовых классов. Но почему возникает ошибка создания экземпляра абстрактного класса?

Ответ 1

Ваш void bar()=0; недопустим - нотация =0 может использоваться только с виртуальными функциями.

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

Например, рассмотрите драйверы устройств. У нас может быть драйвер для абстрактного устройства хранения. Мы определяем некоторые возможности для этого устройства, такие как чтение и запись данных. Этот абстрактный класс дает любой код, который хочет читать/писать данные, способность работать с конкретным классом, который происходит из этого абстрактного класса.

Мы не можем просто создать экземпляр нашего абстрактного устройства хранения. Вместо этого нам нужен конкретный объект, например, флэш-накопитель, дисковод и т.д., Чтобы на самом деле читать/писать. Конкретный класс необходим, потому что нам нужен код, специфичный для реального устройства, для выполнения команд, которые мы определили в нашей абстрактной базе. Наш абстрактный класс хранения имеет только чтение или запись, но чтение или запись, нам нужен драйвер для определенного устройства. Можно было бы знать, как разговаривать с жестким диском SATA, а другой знает, как разговаривать с флеш-накопителем USB, а третий знает, как читать или записывать на SD-карту. Однако мы не можем просто сказать: "Я собираюсь создать абстрактное запоминающее устройство" и поговорить с ним, не определяя фактический код, который переведет команду "записать" в (например) правильные сигналы, идущие через SATA, USB, Firewire и т.д., Чтобы получить данные на реальном диске.

Таким образом, попытка создать экземпляр нашего абстрактного класса не имеет смысла и не допускается. Мы просто используем абстрактный базовый класс, чтобы остальная часть системы могла работать со всеми устройствами равномерно. Остальная часть кода не волнует, как сигналы отличаются друг от друга - он просто видит кучу дисковых накопителей и может работать со всеми из них, хотя детали чтения данных через USB полностью отличаются от чтения через Firewire (например).

Ответ 2

Абстрактный класс представляет собой нечто, что не является достаточно специфичным для создания экземпляра. Например, что, если кто-то попросил вас создать транспортное средство? Вы должны спросить: "Какой автомобиль?" Вы не знали, создавать ли автомобиль, сани или космический челнок. Нет такого объекта, как "транспортное средство". Тем не менее "транспортное средство" - полезная абстракция, которая может использоваться для группировки объектов, указывая на общее поведение среди них. Для чего предназначены абстрактные классы.

Ответ 3

Абстрактный класс - это больше, чем интерфейс. У него могут быть данные. Он может иметь функции-члены, которые не являются чисто виртуальными или вообще не виртуальными. Даже чистая виртуальная функция может иметь тело, обеспечивающее реализацию по умолчанию. Таким образом, речь идет не о физической невозможности создания абстрактного класса.

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

Абстрактный класс недостаточно специфичен для создания экземпляра. Не обязательно потому, что в нем отсутствует определение функции, потому что она не может ее упустить. Это недостаточно специфично, потому что оно представляет собой абстрактную концепцию, которая должна быть сделана более конкретной, прежде чем она может быть создана.

Ответ 4

То, что вся точка абстрактного класса: некоторые детали должны быть предоставлены разработчиком.

Подумайте об этом: как было бы обозначать класс как абстрактный, если бы вы могли его создать напрямую? Тогда это ничем не отличается от любого другого класса.

Ответ 5

Причина, по которой абстрактный класс не может быть создан, - это: что вы делаете, если выполняете чистую виртуальную функцию? Это будет серьезной ошибкой, и лучше поймать ее во время компиляции, чем во время выполнения.

Ответ 6

В абстрактном классе определение метода не задано, предоставляется только структура. Если бы мы могли создать экземпляр абстрактного класса и назвать этот метод, это будет огромный беспорядок. Абстрактный класс используется для поддержки шаблона проектирования кода.