Производный класс не может использовать указатель на член защищенного базового класса

include <stdio.h>

class Base
{
protected:
int foo;
int get_foo() { return foo; }
};

class Derived : public Base
{
public:
void bar()
{
int Base::* i = &Base::foo;
this->*i = 7;
printf("foo is %d\n", get_foo());
}
};int main()
{
Derived d;
d.bar();
}

Я не понимаю, почему мой производный тип не может сделать указатель на защищенный член базового класса. Он имеет право доступа к участнику. Он может вызывать функцию с аналогичной областью действия. Почему он не может сделать указатель на член? Я использую gcc 4.1.2 и получаю эту ошибку:

test.cc: In member function ‘void Derived::bar()’:
test.cc:6: error: ‘int Base::foo’ is protected
test.cc:15: error: within this context

4

Решение

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

include <stdio.h>

class Base
{
protected:
int foo;
int get_foo() { return foo; }
};

class Derived : public Base
{
public:
void bar()
{
int Derived::* i = &Derived::foo;
this->*i = 7;
printf("foo is %d\n", get_foo());
}
};

int main()
{
Derived d;
d.bar();
}

Если члены базы определены как частные, то вы получите ожидаемую ошибку отсутствия доступа.

5

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


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