【问题标题】:Defining a member function pointer to a function inherited privately定义一个指向私有继承函数的成员函数指针
【发布时间】:2011-11-20 14:58:02
【问题描述】:

当定义一个指向从基类私有继承的函数的成员函数指针时,你会如何声明它?

例如..

// class B defined here

class A; //forward dec

typedef void (B::*fnc_ptr)(); // This? or..
typedef void (A::*fnc_ptr)(); // this...?

class A: private B{
   public:
      A(): ptr(0){};
      ~A(){};

      using B::fnc;

      void setandcall(){
           ptr = &fnc;
           (*ptr)();
      }

      fnc_ptr ptr;
};

【问题讨论】:

    标签: c++


    【解决方案1】:

    你没有附加你得到的错误。我认为你真正的错误可能是两者都有

    typedef (B::*fnc_ptr)(); // This? or..
    typedef (A::*fnc_ptr)(); // this...?
    

    您的选择没有指定返回类型。

    话虽如此,你的两个构造都可以工作。您的问题是,当您调用非静态成员函数时,您需要传递 this 参数。私有继承只影响 A 的消费者而不是 A 本身。

    class B
    {
    public:
        void fnc();
    
    };
    
    
    typedef void (B::*fnc_ptr)(); // This? or..
    
    class A: private B{
    
    
    
       public:
          A(): ptr(0){};
          ~A(){};
    
    
          void setandcall(){
              ptr = &B::fnc;
              (this->*fnc)();
          }
    
          fnc_ptr ptr;
    };
    

    【讨论】:

    • 没有返回类型是错字 - 现在已编辑。我还没有编译它我只是想知道在这种情况下我应该怎么做?
    • this->fnc() 应该是(this->*fnc)()
    【解决方案2】:

    没关系。但是,当您形成指向成员的指针时,您必须明确指定 &A::fnc&B::fnc&fnc 无效。

    如果fnc 继承自B,则&A::fnc 的类型为void (B::*)(),但转换为void (A::*)() 是安全的,因为对基类进行操作的函数可以安全地对派生类的实例进行操作班级。然而,另一种方式的转换是不安全的。显然,这种转换将您可以使用指向成员的指针的类的范围限制为仅派生类类型的对象。

    另外,当您调用它时,您需要使用->*.* 运算符。 (*ptr)() 无效。例如。 (this->*ptr)().

    【讨论】:

      猜你喜欢
      • 2016-06-24
      • 2012-05-11
      • 2012-04-12
      • 2010-09-08
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      相关资源
      最近更新 更多