Подтвердить что ты не робот

Могут ли виртуальные классы на С++ иметь переменные-члены?

Предположим, что у меня есть чисто виртуальный класс, могу ли я сделать что-то подобное в С++:

class ITreatable
{
    public:
       bool hasBeenTreated;           // <- Can this be here?
       virtual bool Treat() = 0;
};

И если нет, как я могу гарантировать, что классы, наследующие ITreatable, имеют переменную-член, называемую hasBeenTreated? Это возможно? Есть ли какая-то лучшая практика, которая позволяет избежать этого/советует против этого?

Спасибо

Изменить: Также как я могу определить конструктор для такого класса?

Edit2: Я понимаю, что переменные public member являются плохой практикой, мне просто интересно, является ли дизайн вообще хорошей идеей в С++ или нет.

4b9b3361

Ответ 1

Совершенно верно.

Строго говоря, нет такой вещи, как "виртуальный класс". Я понимаю, что вы используете термин для обозначения класса, построенного только из членов данных и виртуальных функций-членов.

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

Ответ 2

Да.

В С++ нет понятия "чистый виртуальный" класс, а только абстрактные классы с виртуальными членами.

Что касается наилучшей практики, я бы сказал, что самая большая практика, которой следует следовать в этом примере, заключается не в использовании общедоступных переменных. Скорее всего, в базовом классе определен параметр setter/getter, который изменяет приватную переменную.

Ответ 3

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

Он считал, что плохая практика объявляет переменные как общедоступные в классах. Вы можете сделать его приватным и объявить его accessor/mutator или объявить его как защищенный.

Ответ 4

В соответствии с MSDN интерфейс имеет следующие характеристики:

  • Класс интерфейса (или struct) должен быть объявлен в пространстве имен и могут иметь государственную или частную доступность. Только публичные интерфейсы испускаются метаданные.
  • Элементы интерфейса могут включать свойства, методы и события.
  • Все члены интерфейса неявно общедоступны и виртуальны.
  • Поля и статические элементы не разрешены.
  • Типы, которые используются как свойства, параметры метода или возврат значениями могут быть только типы времени выполнения Windows; это включает основные типы и типы классов перечислений.

Итак, я бы ответил на ваш вопрос с помощью

НЕТ, если вам нужен интерфейс

и

Да, если вы просто используете абстрактные классы, но, как говорят другие, сделайте их частными и используйте публичные геттеры и сеттеры