你不能.A
没有方法new_function
,你对编译器撒谎.你有三种方法
移动new_function
到A
并通过A::new_function
(作为virtual
优选).
class A { void (A::*curr_f)(); public: void set(void (A::*f)()) { curr_f = f; } virtual void new_function() {}; }; class B : A { public: void main() { set(&A::new_function); }; void new_function() {}; };
转发B
声明和存储B::*
在A
:
class B; class A { void (B::*curr_f)(); public: void set(void (B::*f)()) { curr_f = f; } }; class B : A { public: void main() { set(&B::new_function); } void new_function() {} };
您可以尝试基于模板的方式,例如奇怪的重复模板模式(CRTP).
template <typename D> class A { void (D::*curr_f)(); public: void set(void (D::*f)()) { curr_f = f; } }; class B : public A<B> { public: void main() { set(&B::new_function); } void new_function() {} };