C ++继承函数指针,可以与仅派生方法一起使用

时间:2016-05-21 23:23:08

标签: c++ pointers inheritance

这是设计问题的简化示例。

我有班级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 ))是不同的。

简短

有没有办法在基类中有一个指针变量可以分配给派生类方法(没有被覆盖)?

2 个答案:

答案 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() { }
};

这不是你要求的,但它至少是一个可行的解决方案。