Search code examples
c++inheritancevirtual

When inheriting from public interface, why it doesn't matter if the implementation is public or private?


I might be very well just tired or too long far from C++ but this one really surprised me today:

#include <iostream>

class Interface
{
public:
    virtual int aa() const = 0;
    virtual int bb() const = 0;
};

class Usage : public Interface
{
private:
    virtual int aa() const
    {
        int a = 10 * 10;
        return a;
    }

    virtual int bb() const
    {
        int b = 20 * 20;
        return b;
    }
};

int main(int argc, char* argv[])
{
    Interface* i = new Usage();
    std::cout << i->bb() << std::endl;

    return 0;
}

I'd expect compiler and/or linker would complain about either bad function signature or at least about missing implementation. Considering this is working and ok, what is the meaning of public/protected/private modifiers when it's hidden by the top class declaration?

How does this rule call in C++ ?


Solution

  • This is specified in paragraph 11.6.1 of the standard:

    The access rules (clause 11) for a virtual function are determined by its declaration and are not affected by the rules for a function that later overrides it. [Example - basically same as yours] Access is checked at the call point using the type of the expression used to denote the object for which the member function is called . The access of the member function in the class in which it was defined is in general not known.