可与仅派生方法一起使用的 C++ 继承函数指针
Posted
技术标签:
【中文标题】可与仅派生方法一起使用的 C++ 继承函数指针【英文标题】:C++ Inheriting Function Pointer that can be used with derived only methods 【发布时间】:2016-05-21 23:23:07 【问题描述】:这是一个设计问题的简化示例。
我有课程Base
。它具有函数指针类型和该函数指针类型的受保护变量。
#ifndef BASE_H
#define BASE_H
class Base
typedef void (Base::*FunctionPointer) ( void );
protected:
FunctionPointer pointer;
;
#endif /* BASE_H */
然后我有继承自Base
的类Derived
。此类希望能够将继承的 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 )
)不同。
简而言之
有没有办法让基类中的指针变量可以分配给派生类方法(不被覆盖)?
【问题讨论】:
能否请您详细说明您的 Y 用例,而不是提出 X 问题? 【参考方案1】:有没有办法让基类中的指针变量可以分配给派生类方法(不被覆盖)?
不,你不能那样做。它们是不相关的类型。
【讨论】:
我知道它不起作用,因为它们是不相关的类型。是否有一种适用于所有派生类的类型,即一种不是特定于类的类型,或者一种适用于通过继承相互关联的类的类型?【参考方案2】:我和@RSahu 在一起:这是不可能的,因为它们是不相关的类型。 出于好奇,我添加了这个答案。
您可以使用 CRTP 习语做类似的事情:
template<class D>
struct B
using FnType = void(D::*)();
FnType ptrnullptr;
;
struct D: B<D>
D(): B
ptr = &D::method;
void method()
;
这并不完全符合您的要求,但至少是一个可行的解决方案。
【讨论】:
以上是关于可与仅派生方法一起使用的 C++ 继承函数指针的主要内容,如果未能解决你的问题,请参考以下文章