Могут ли виртуальные классы на С++ иметь переменные-члены?
Предположим, что у меня есть чисто виртуальный класс, могу ли я сделать что-то подобное в С++:
class ITreatable
{
public:
bool hasBeenTreated; // <- Can this be here?
virtual bool Treat() = 0;
};
И если нет, как я могу гарантировать, что классы, наследующие ITreatable
, имеют переменную-член, называемую hasBeenTreated
? Это возможно? Есть ли какая-то лучшая практика, которая позволяет избежать этого/советует против этого?
Спасибо
Изменить: Также как я могу определить конструктор для такого класса?
Edit2: Я понимаю, что переменные public member являются плохой практикой, мне просто интересно, является ли дизайн вообще хорошей идеей в С++ или нет.
Ответы
Ответ 1
Совершенно верно.
Строго говоря, нет такой вещи, как "виртуальный класс". Я понимаю, что вы используете термин для обозначения класса, построенного только из членов данных и виртуальных функций-членов.
Считайте, что только функции могут быть виртуальными; если вы хотите, чтобы члены данных были доступны полиморфно, вы должны сделать это через функции. Таким образом, используйте функции виртуального геттера/сеттера и сохраняйте своих членов данных конфиденциальными.
Ответ 2
Да.
В С++ нет понятия "чистый виртуальный" класс, а только абстрактные классы с виртуальными членами.
Что касается наилучшей практики, я бы сказал, что самая большая практика, которой следует следовать в этом примере, заключается не в использовании общедоступных переменных. Скорее всего, в базовом классе определен параметр setter/getter, который изменяет приватную переменную.
Ответ 3
Это возможно. С++ не имеет интерфейсов, применяемых языком, поэтому ваш пример действует как нормальное определение класса без каких-либо специальных правил.
Он считал, что плохая практика объявляет переменные как общедоступные в классах. Вы можете сделать его приватным и объявить его accessor/mutator или объявить его как защищенный.
Ответ 4
В соответствии с MSDN интерфейс имеет следующие характеристики:
- Класс интерфейса (или struct) должен быть объявлен в пространстве имен
и могут иметь государственную или частную доступность. Только публичные интерфейсы
испускаются метаданные.
- Элементы интерфейса могут включать свойства, методы и
события.
- Все члены интерфейса неявно общедоступны и виртуальны.
- Поля и статические элементы не разрешены.
- Типы, которые используются как свойства, параметры метода или возврат
значениями могут быть только типы времени выполнения Windows; это включает
основные типы и типы классов перечислений.
Итак, я бы ответил на ваш вопрос с помощью
НЕТ, если вам нужен интерфейс
и
Да, если вы просто используете абстрактные классы, но, как говорят другие, сделайте их частными и используйте публичные геттеры и сеттеры