可与仅派生方法一起使用的 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++ 继承函数指针的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的指针行为 C++ / 继承

virtual虚函数

虚函数 C++ 中的默认参数

深入理解C++ 虚函数表

C++ 函数指针参数和类继承自动转换

c++中,虚函数能不能被继承