Search code examples
c++privatepointer-to-member

Able to use pointer to function to call private method of an external class


Based on the following answer to a recent question, I'm able to use a function pointer in order to call the private method Foo<T>::foo() from another class Bar, as shown below (see also ideone)

#include <iostream>

template<typename T>
struct Bar
{
    typedef void (T::*F)();

    Bar( T& t_ , F f ) : t( t_ ) , func( f )
    {
    }

    void operator()()
    {
        (t.*func)();
    }

    F func;
    T& t;
};

template<typename T>
class Foo
{
private:
    void foo()
    {
        std::cout << "Foo<T>::foo()" << std::endl;
    }

public:    
    Foo() : bar( *this , &Foo::foo ) 
    {
        bar();
    }

    Bar<Foo<T> > bar;
};

int main()
{
    Foo<int> foo;
}

This works on MSVC 2013 and GCC 4.8.3. Is it valid?


Solution

  • Yes it is permissible, and it works.

    C++ Programming by Bjarne Stroustoup

    C++ protects against accident rather than deliberate circumvention (fraud)

    Sure, you cannot directly/easily call private methods outside the class, but if you are making enough efforts, C++ will allow it.