У меня есть следующая схема:
class Interface
{
virtual ~Interface() { }
virtual void foo() const = 0;
virtual void bar() const = 0;
}
//Interface is derived privately mostly for preventing upcast outside
class Derived : private Interface
{
public:
void foo() const;
private:
void bar() const;
}
Он не компилируется: foo
это личное. Есть ли способ сделать его публичным, не добавляя фиктивную публичную функцию?
С точки зрения языка вполне допустимо, чтобы открытая функция-член в производном классе переопределяла закрытую функцию-член в базовом классе. Является ли это хорошей идеей, это другой вопрос. И, конечно же, для абстрактного базового класса не имеет смысла иметь публичные функции-члены.
Проблема с вашим кодом в том, что Interface
имеет собственный деструктор, делающий невозможным для производных классов уничтожать их подобъекты базового класса. ~Interface()
должен быть либо защищенным, либо публичным.
Нет, нет
Кроме того, даже фиктивная публичная функция потребовала бы, чтобы foo
в базе были protected
не private
,
Я хотел бы вернуться к вашему дизайну. Если функция предназначена для публичного доступа, то почему public
?
Не разрешается изменять доступность унаследованного члена. Если бы это было разрешено, вы могли бы наследовать класс и сделать его частным или защищенным членом открытым, нарушая инкапсуляцию.