наследование — виртуальная функция C ++ от частного унаследованного класса, повышенная до public в объявлении производного класса

У меня есть следующая схема:

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 это личное. Есть ли способ сделать его публичным, не добавляя фиктивную публичную функцию?

0

Решение

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

Проблема с вашим кодом в том, что Interface имеет собственный деструктор, делающий невозможным для производных классов уничтожать их подобъекты базового класса. ~Interface() должен быть либо защищенным, либо публичным.

2

Другие решения

Нет, нет

Кроме того, даже фиктивная публичная функция потребовала бы, чтобы foo в базе были protectedне private,

Я хотел бы вернуться к вашему дизайну. Если функция предназначена для публичного доступа, то почему public?

0

Не разрешается изменять доступность унаследованного члена. Если бы это было разрешено, вы могли бы наследовать класс и сделать его частным или защищенным членом открытым, нарушая инкапсуляцию.

-1
По вопросам рекламы [email protected]