Могу ли я определить конструктор в абстрактном базовом классе?

Я хочу написать интерфейсный класс на C ++, который является чисто виртуальным абстрактным базовым классом.

Могу ли я определить конструкторы в этом классе интерфейса? Конструктор не может быть чисто виртуальной функцией, но как я могу определить конструкторы для класса интерфейса?

Редактировать: мне нужен виртуальный деструктор в таком классе интерфейса?

1

Решение

На самом деле есть два вопроса в одном:

  • Может ли ABC иметь ctor?Конечно может! Представьте, что у вас есть почти полный класс с личными данными, в котором отсутствует только один конкретный метод. Этот метод должен быть чисто виртуальным, делая класс абстрактным, но вам все равно придется инициализировать данные класса в ctor. вопрос, предложенный Полом Руни пример тому
  • Может интерфейс есть ктор?: Нет, не может по определению. Интерфейс — это специальный ABC, который содержит только чисто виртуальные методы. Он не имеет реализации, даже частичной, и поэтому не нуждается в ctor. И вы уже отметили, что

Конструктор не может быть чисто виртуальной функцией

TL / DR: если вы пытаетесь добавить конструктор к вашему интерфейс, тогда это уже не интерфейс, а простой абстрактный базовый класс, который вполне может иметь его.

3

Другие решения

C ++ не имеет понятия интерфейса. Есть конкретные классы и абстрактные классы, не более того. Абстрактные классы могут иметь конструкторы, члены данных и все остальное. Единственное, что нужно для пометки абстракта класса — это одна чисто виртуальная функция-член.

Некоторые люди используют слово «интерфейс» для обозначения абстрактного класса без каких-либо элементов данных или функций, не являющихся чисто виртуальными. Другие люди используют немного другие определения. Точное определение не имеет никакого значения для языка. Вы можете иметь члены данных и определять конструктор, и все же называть свой класс интерфейсом, никто не собирается давать вам указание на это. Или вы можете просто избежать этого термина.

0

По вопросам рекламы [email protected]