当定义一个成员函数指针,指向一个私有地从基类继承的函数时,你会如何声明它?
例如..
// 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;
};
答案 0 :(得分:1)
您没有附加您收到的错误。我认为你的真正错误可能就是
typedef (B::*fnc_ptr)(); // This? or..
typedef (A::*fnc_ptr)(); // 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;
};
答案 1 :(得分:1)
没关系。但是,在形成指向成员的指针时,必须明确指定&A::fnc
或&B::fnc
。 &fnc
无效。
如果fnc
继承自B
,那么&A::fnc
的类型为void (B::*)()
,但转换为void (A::*)()
作为在基础上运作的函数是安全的class可以安全地对派生类的实例进行操作。然而,另一种方式的转换并不安全。显然,转换将可以使用指向成员的指针的类的范围限制为仅包含派生类类型的对象。
此外,当您调用它时,您需要使用->*
或.*
运算符。 (*ptr)()
无效。例如。 (this->*ptr)()
。