重新分配虚函数是否合法

Is reassigning a virtual function legal

假设我有一个这样的class:

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

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

我意识到是这样的:

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

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

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

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

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

不,无法重新分配功能。

您可以做两件事来获得不同的函数行为:

  1. 使用函数指针。
  2. 继承此 class 并覆盖该函数。

很可能这两种方法都不是您遇到的问题的完美解决方案。


函数指针的示例可能是:

struct A{
  virtual void (*pSomeFunc)(void);
};

...

A a;
a.pSomeFunc = &aRandomFunc;
a.pSomeFunc();

一个继承示例可能是:

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

您应该尝试 std::function,它可以满足您的需求。

这里是你如何使用这个 class:

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

然后你以后可以改成什么函数:

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

或者甚至用另一个 lambda 代替它:

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