2014-09-02 4 views
0

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

Представьте себе, что у нас есть это:

class Numeric 
{ 
public: 
    virtual ~Numeric() {} 
    virtual int getNumeric() const = 0; 
}; 

Это считается интерфейс.

А теперь я вставить нумератор (Это может быть что-то еще, вроде ЬурейеЕ и т.д.)

class Numeric 
{ 
public: 
    enum Numbers 
    { 
     One, 
     Two, 
    }; 

    virtual Numbers getNumeric() const = 0; 
}; 

до сих пор интерфейс или он теперь считается абстрактным классом?

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

+2

По сути, это различие без разницы. Как правило, интерфейс не имеет ничего общего с реализацией внутри него. В то время как абстрактный класс считается способным иметь в нем материал реализации. – randomusername

+0

Вы добавили публичную переменную-член «числа»? – Horstling

+0

@randomusername - Когда вы говорите внутри, вы имеете в виду внутри методов или самого класса? потому что это и есть причина вопроса. Перечисление объявляется внутри класса, тогда если класс считается абстрактным для деклараций в классе, то он становится абстрактным классом. Я прав? - Напротив, это будет интерфейс. – yayuj

ответ

1

Если вы ищете официальный ответ, то я боюсь, что его нет.

Проект стандарта C++ 11 У меня возникает здесь лишь говорит [10,4 class.abstract]:

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

Все другие экземпляры слова «интерфейс» в целом ~ 1300 страниц PDF относятся только к родовым программирования или других вещей, не связанных с ООП или абстрактных классов.

Например, это один здесь [24.2.1 iterator.requirements.general]:

Большинство алгоритмических шаблонов библиотеки, которые работают на данных структуры имеют интерфейсы, которые используют диапазоны.

Это, очевидно, не имеет никакого отношения к абстрактным классам.

Сам Бьярн Страуструп, если вы принимаете его слова как «полуофициальные», на самом деле не поможет вам в этом отношении.Цитирование из glossary on his homepage:

абстрактный класс - класс, определяющий только интерфейс; используемый как основа класс.

Вам придется жить с тем, что C++ самого языка, а также ++ разработчики C и эксперты используют слово «интерфейс» как надмножеству для «абстрактного класса». В отличие от, например, в Java, где интерфейсы являются фактическим языковым элементом со своим собственным ключевым словом interface, такого нет в C++.

Все остальное основано на мнениях.

1

Ваш второй класс Numeric - это интерфейс.

Если класс имеет одну или несколько чистых виртуальных функций, то этот класс называется «абстрактным классом».

Как правило, если все функции классов являются чистыми виртуальными функциями, то этот класс называется «интерфейсом».

C++ не имеет явной концепции interface, поэтому вышеупомянутые два класса называются интерфейсом или абстрактным классом, несколько взаимозаменяемо.

0

На мой взгляд, ваш второй класс можно считать интерфейсом. Я не думаю, что есть стандарт, который определяет интерфейсы в C++. Однако на языках с интерфейсами, например Java, вы обычно можете иметь перечисления, определенные внутри интерфейса.

Я бы рассмотрел класс без реализации, чтобы быть интерфейсом.

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