overriding with difference access specification c++

后端 未结 4 1840

I came across a question while taking iKM test. There was a base class with two abstract methods with private access specifier. There was a derived class which was overridin

4条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-11 18:16

    Yes, this is legal, accessibility is checked statically (not dynamically):

    class A {
    public:
        virtual void foo() = 0;
    private:
        virtual void bar() = 0;
    };
    
    class B : public A {
    private:
        virtual void foo() {} // public in base, private in derived
    public:
        virtual void bar() {} // private in base, public in derived
    };
    
    void f(A& a, B& b)
    {
        a.foo(); // ok
        b.foo(); // error: B::foo is private
        a.bar(); // error: A::bar is private
        b.bar(); // ok (B::bar is public, even though A::bar is private)
    }
    
    int main()
    {
        B b;
        f(b, b);
    }
    

    Now, why would you want to do that? It only matters if you use the derived class B directly (2nd param of f()) as opposed to through the base A interface (1st param of f()). If you always use the abstract A interface (as I would recommend in general), it still complies to the "IS-A" relashionship.

提交回复
热议问题