I want to bind()
to my base class\'s version of a function from the derived class. The function is marked protected in the base. When I do so, the code compiles
Answer: see boost::bind with protected members & context which quotes this part of the Standard
An additional access check beyond those described earlier in clause 11 is applied when a non-static data member or nonstatic member function is a protected member of its naming class (11.2)105) As described earlier, access to a protected member is granted because the reference occurs in a friend or member of some class C. If the access is to form a pointer to member (5.3.1), the nested-name-specifier shall name C or a class derived from C. All other accesses involve a (possibly implicit) object expression (5.2.5). In this case, the class of the object expression shall be C or a class derived from C.
Workaround: make foo
a public
member function
#include <functional>
struct Base
{
public: virtual void foo() {}
};
This has nothing to do with bind
. Because of the piece of the Standard @rhalbersma already quoted, the expression &Base::foo
is illegal in a non-friended member of Derived
, in every context.
But if your intent was to do something equivalent to calling Base::foo();
, you have a bigger issue: pointers to member functions always invoke a virtual override.
#include <iostream>
class B {
public:
virtual void f() { std::cout << "B::f" << std::endl; }
};
class D : public B {
public:
virtual void f() { std::cout << "D::f" << std::endl; }
};
int main() {
D d;
d.B::f(); // Prints B::f
void (B::*ptr)() = &B::f;
(d.*ptr)(); // Prints D::f!
}