2016-01-28 5 views
1

Я хочу написать класс «interface» в C++, который является чисто виртуальным абстрактным базовым классом.Могу ли я определить конструктор в абстрактном базовом классе?

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

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

+0

вид. Использование CRTP и static_asserts – bolov

+1

http://stackoverflow.com/questions/19808667/c-abstract-class-constructor-yes-or-no –

+0

Просто сообщите, что вы хотите знать о CRTP как упоминалось @bolov, поскольку это один из способов вы можете это сделать, посмотрите на это [Любопытно повторяющийся шаблон шаблона] (http://eli.thegreenplace.net/2011/05/17/the-curiously-recurring-template-pattern-in-c/) для объяснения. – RobClucas

ответ

2

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

  • Может ли ABC имеют CTOR?: Конечно, это возможно! Представьте, что у вас есть почти полный класс, с частными данными и который не имеет только одного конкретного метода. Этот метод должен быть чистым виртуальным, создающим абстрактный класс, но вам все равно придется инициализировать данные класса в ctor. question suggested by Paul Rooney является примером для этого
  • Может ли интерфейсом есть ли ctor?: Нет, это не может по определению. Интерфейс - это особый ABC, который содержит только чистые виртуальные методы. У него нет реализации даже не частичной, и в этом нет необходимости. И вы уже отметили, что

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

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

0

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

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

Смежные вопросы