重新分配虚拟功能合法吗

Is reassigning a virtual function legal

本文关键字:功能 虚拟 新分配 分配      更新时间:2023-10-16

假设我有一个这样的类:

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

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

我意识到像这样的东西:

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

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

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

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

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

否,不可能重新分配函数。

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

  1. 使用函数指针
  2. 从此类继承并重写函数

很可能这两种方法都不是解决问题的优雅方法。


函数指针的一个例子可能是:

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,它可以满足您的需求。

以下是如何使用这个类:

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

然后你可以稍后更改它的功能:

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

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

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