@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&nbsp;были экземпляром классаBэто не будет проблемой. Но функция хотела бы работать с любым видомA&nbsp;экземпляров. Это, к сожалению, не компилируется. Вот что говорит об этом 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?

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

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

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

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