重新分配虚拟功能是合法的

时间:2016-05-11 23:10:01

标签: c++ inheritance function-pointers virtual

假设我有这样一个类:

struct A{
  virtual void someFunc() { }
};

是否可以将虚函数重新分配给另一个函数....这可能是可能的,因为它基本上将一个函数指针存储在类中,以便它可以是virtual

我意识到这样的事情:

void aRandomFunc();
A mya;
mya.someFunc = &aRandomFunc;

可能是不可能的,因为成员函数将this指针作为隐式参数。

但是可以将成员函数重新分配给另一个成员函数吗?

3 个答案:

答案 0 :(得分:10)

不,在任何情况下都不能重新分配功能。

但是,您可以重新分配函数指针,但这是否有用取决于您实际尝试的操作。 https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem

答案 1 :(得分:3)

不,不可能重新分配功能。

你可以做两件事来获得不同的功能行为:

  1. 使用函数指针。
  2. 继承此类并覆盖该函数。
  3. 这些方法很可能都不是解决您遇到问题的优雅方法。

    函数指针的示例可能是:

    struct A{
      virtual void (*pSomeFunc)(void);
    };
    
    ...
    
    A a;
    a.pSomeFunc = &aRandomFunc;
    a.pSomeFunc();
    

    继承示例可能是:

    struct AWithDifferentFuncAbility : public A {
        virtual void someFunc() {
           //some new functionality;
        }
    }
    

答案 2 :(得分:0)

你应该尝试std::function,它会做一些接近你需要的东西。

以下是关于如何使用此课程的方法:

struct A{
  std::function<void()> someFunc = []{ /* default implementation */ };
};

然后你可以改变以后的功能:

void aRandomFunc();
A mya;
mya.someFunc = &aRandomFunc;

甚至用另一个lambda代替它:

mya.someFunc = []{ /* another function */ };