У меня есть этот код:
class Foo
{
public:
int x = 4;
int & operator[](size_t index) { return x; }
};
class Bar : protected Foo
{
public:
using Foo::operator[];
Bar () { x++; }
};
int main(int agrc, char ** argv)
{
typedef int &(Bar::*getOp)(size_t index);
Bar b;
auto bVal = b[4];
getOp o = &Bar::operator[];
auto bVal2 = (b.*o)(7);
}
Однако я не могу скомпилировать это, потому что
ошибка C2247: «Foo» недоступен, поскольку «Bar» использует «protected» для наследования от «Foo»
Почему это невозможно, когда я использовал using
и могу напрямую вызывать оператора? Есть ли способ обойти?
Если я изменяю наследование на общедоступное, оно работает.
Примечание: Это просто пример большего класса. Я не хочу использовать публичное наследование, потому что я не хочу иметь возможность делать Foo f = Bar()
, потому что в Bar
я скрываю родительские методы (я не использую виртуальный).