@chtz забыл статическое приведение.

, что базовый классA определяет защищенный член. Производный классB использует этот член.

class A
{
public:
  A(int v) : value(v) { }

protected:
  int value;
};

class B : public A
{
public:
  B(int v) : A(v) { }
  void print() const;
  void compare_and_print(const A& other) const;
};

ФункцияB::print просто берет значение текущего члена и печатает его:

void B::print() const
{
  std::cout << "Value: " << value << "\n";
}

Другая функция-член,B::compare_and_print, берет примерA, проверяет их значения и печатает максимум обоих:

void B::compare_and_print(const A& other) const
{
  auto max_value = std::max(value, other.value);
  std::cout << "Max value: " << max_value << "\n";
}

Еслиother были экземпляром классаBэто не будет проблемой. Но функция хотела бы работать с любым видомA экземпляров. Это, к сожалению, не компилируется. Вот что говорит об этом Clang:

test.cpp:27:42: error: 'value' is a protected member of 'A'
  auto max_value = std::max(value, other.value);
                                         ^
test.cpp:9:7: note: can only access this member on an object of type 'B'
  int value;
      ^
1 error generated.

Это ограничение звучит для меня нелогично. Однако я не собираюсь оспаривать стандарт C ++ по этому поводу (тем не менее меня интересует обоснование этого решения).

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

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

Как я могу включить использование защищенного члена базового класса производным классом без экспорта члена через API?

РЕДАКТИРОВАТЬ: Некоторые связанные вопросы:

Доступ к защищенным членам в производном классеКак получить доступ к защищенным членам в производном классе?

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

Возможно, такой модели не может быть, я признаю.

Ответы на вопрос(2)

Ваш ответ на вопрос