Я запутался в ошибках, вызванных следующим кодом .В Derived :: doStuff я могу получить доступ к Base :: output напрямую, вызвав его.
Почему я не могу создать указатель на output()
в том же контексте, в котором я могу вызвать output()
?
(я думал, что защищенный / приватный определяет, можете ли вы использовать имя в определенном контексте, но, по-видимому, оно неполно?)решение?
#include <iostream>
using std::cout; using std::endl;
template <typename T, typename U>
void callback(T obj, U func)
{
((obj)->*(func))();
}
class Base
{
protected:
void output() { cout << "Base::output" << endl; }
};
class Derived : public Base
{
public:
void doStuff()
{
// call it directly:
output();
Base::output();
// create a pointer to it:
// void (Base::*basePointer)() = &Base::output;
// error: 'void Base::output()' is protected within this context
void (Derived::*derivedPointer)() = &Derived::output;
// call a function passing the pointer:
// callback(this, &Base::output);
// error: 'void Base::output()' is protected within this context
callback(this, &Derived::output);
}
};
int main()
{
Derived d;
d.doStuff();
}
Редактировать: Я хотел бы знать, где это находится в stardard, но в основном я просто пытаюсь обернуть голову вокруг концепции.Я думаю, что моя проблема в том, что callback
не имеет доступа к защищенным членам Derived
, но он может вызвать Derived::output
, если вы передадите ему указатель.Чем защищенный элемент Derived
из Derived
отличается от защищенного элемента Derived
из Base
?