Why does C++ not allow inherited friendship?

前端 未结 10 1568
终归单人心
终归单人心 2020-11-28 04:11

Why is friendship not at least optionally inheritable in C++? I understand transitivity and reflexivity being forbidden for obvious reasons (I say this only to head off sim

10条回答
  •  攒了一身酷
    2020-11-28 04:29

    Friend is good in inheritance like style interface for container But for me, as the first say, C++ lack the propagatable inheritance

    class Thing;
    
    //an interface for Thing container's
    struct IThing {
       friend Thing;
       protected:
           int IThing_getData() = 0;
    };
    
    //container for thing's
    struct MyContainer : public IThing {
        protected: //here is reserved access to Thing
             int IThing_getData() override {...}
    };
    
    struct Thing {
        void setYourContainer(IThing* aContainerOfThings) {
            //access to unique function in protected area 
            aContainerOfThings->IThing_getData(); //authorized access
        }
    };
    
    struct ChildThing : public Thing {
        void doTest() {
            //here the lack of granularity, you cannot access to the container.
            //to use the container, you must implement all 
            //function in the Thing class
            aContainerOfThings->IThing_getData(); //forbidden access
        }
    };
    

    For me the problem of C++ is the lack of very good granularity to control all access from anywhere for anything :

    friend Thing can become friend Thing.* to grant access to all child of Thing

    And more, friend [named area] Thing.* to grant access for a precise are in the Container class via special named area for the friend.

    Ok stop the dream. But now, you know an interesting usage of friend.

    In another order, you can also found interesting to known all class are friendly with self. In other word, a class instance can call all
    members of another instance of same name without restriction:

    class Object {
         private:
             void test() {}
         protected:
             void callAnotherTest(Object* anotherObject) {
                 //private, but yes you can call test() from 
                 //another object instance
                 anotherObject)->test(); 
             }
    };
    

提交回复
热议问题