【问题标题】:Override virtual protected method that is a friend of another class覆盖另一个类的朋友的虚拟受保护方法
【发布时间】:2019-01-25 10:49:39
【问题描述】:

基本上,我想以某种方式模拟友谊继承,但它只能在某个方法内部发生。

所以本质上,这就是我想要的

class A; // Forward declaration
class Base{
   friend class A; // friend declaration so that A is able to see protected methods

   protected:
   virtual void method() {// some definition, might also be pure virtual}

}

class Derived : public Base{
     A aObj;
     void method(){//override the one in base and also gain access to aObj private members.}
     public:
     //public interface
} 


class A {
    int var;
    friend void Base::method(); 
    public:
      // public interface
}

有没有办法做到这一点?

【问题讨论】:

  • 请阅读问题,我对从 A 内部调用 method 不感兴趣,我想允许 base 的派生类从特定方法中访问 A 的私有成员。
  • 为什么要设这么多限制?
  • 因为我只希望 base 的派生类能够访问 A 的私有成员,而不必每次从 Base 派生时手动将朋友声明插入 A
  • 在派生类中,A 成员必须定义为A* 以避免non complete class 编译器的错误。
  • 不确定我是否 100% 了解您在寻找什么,我刚刚发布了一个可能的答案,请不要犹豫,告诉您这不是您要找的。​​span>

标签: c++ inheritance overriding friend


【解决方案1】:

您可以在Base 中获取指向private 的A 成员的指针,然后将这些成员指针传递给Derived

class A; // Forward declaration
class Base{
   friend class A; // friend declaration so that A is able to see protected methods

   private:
   void method(A&);
   virtual void do_method(A& a,int A::* var) {// some definition, might also be pure virtual
     (a.*var)++;
   }

};
class A{
    int var;
    friend void Base::method(A&);
};
class Derived : public Base{
     A aObj;
     virtual void do_method(A& a,int A::* var) {// some definition, might also be pure virtual
     a.*var+=2;
   }
     public:
     //public interface
};

void Base::method(A& a){
       do_method(a,&A::var);
   }

注意:不要在关键关卡上使用它!!

【讨论】:

    【解决方案2】:

    这个怎么样

    class Base {
       friend class A; 
       protected:
       virtual void method() = 0;
       std::tuple<int> GetAProperties(const A& a) {     
            // You can change the tuple params
            // as per your requirement.
            return std::make_tuple(a.var);
       }
    }
    
    class Derived : public Base {
        A aObj;
        void method() override {
            auto objProperties = GetAProperties(aObj);
        }
    }
    

    【讨论】:

    • 比我的溶胶好
    • 如果有auto GetAProperties... return std::forward_as_tuple(a.var)会更好
    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2016-12-26
    相关资源
    最近更新 更多