这是设计问题的简化示例。
我有班级Base
。它有一个函数指针类型和该函数指针类型的受保护变量。
#ifndef BASE_H
#define BASE_H
class Base {
typedef void (Base::*FunctionPointer) ( void );
protected:
FunctionPointer pointer;
};
#endif /* BASE_H */
然后我有一个继承自Derived
的班级Base
。此类希望能够将继承的pointer
变量设置为等于其自身方法的地址,而不是从Base
继承或覆盖的地址。
#ifndef DERIVED_H
#define DERIVED_H
#include "Base.h"
class Derived : public Base{
public:
Derived()
{
pointer = &Derived::ProtectedMethod;
}
void ProtectedMethod()
{
}
};
#endif /* DERIVED_H */
问题是函数指针的类型(void (Base::*FunctionPointer) ( void )
和void (Derived::*FunctionPointer) ( void )
)是不同的。
简短
有没有办法在基类中有一个指针变量可以分配给派生类方法(没有被覆盖)?
答案 0 :(得分:4)
有没有办法在基类中有一个指针变量可以分配给派生类方法(没有被覆盖)?
不,你不能这样做。它们是不相关的类型。
答案 1 :(得分:1)
我和@RSahu:他们不可能是不相关的类型 我为了好奇而添加了这个答案。
您可以使用CRTP惯用法做类似的事情:
template<class D>
struct B {
using FnType = void(D::*)();
FnType ptr{nullptr};
};
struct D: B<D> {
D(): B{} {
ptr = &D::method;
}
void method() { }
};
这不是你要求的,但它至少是一个可行的解决方案。