C++ 重新分配虚拟功能合法吗

C++ 重新分配虚拟功能合法吗,c++,inheritance,function-pointers,virtual,C++,Inheritance,Function Pointers,Virtual,假设我有一个这样的类: struct A{ virtual void someFunc() { } }; void aRandomFunc(); A mya; mya.someFunc = &aRandomFunc; 是否可以将虚拟函数重新分配给另一个函数……这可能是因为它基本上在类中存储了一个函数指针,因此它可以是虚拟的 我意识到这样的事情: struct A{ virtual void someFunc() { } }; void aRandomFunc(); A my

假设我有一个这样的类:

struct A{
  virtual void someFunc() { }
};
void aRandomFunc();
A mya;
mya.someFunc = &aRandomFunc;

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

我意识到这样的事情:

struct A{
  virtual void someFunc() { }
};
void aRandomFunc();
A mya;
mya.someFunc = &aRandomFunc;
这可能是不可能的,因为成员函数将
指针作为隐式参数


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

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


但是,您可以重新分配函数指针,但这是否有用取决于您实际尝试执行的操作

否,无法重新分配功能

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

  • 使用函数指针
  • 从该类继承并重写该函数
  • 很可能这两种方法都不是解决问题的完美方法


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

    struct A{
      virtual void (*pSomeFunc)(void);
    };
    
    ...
    
    A a;
    a.pSomeFunc = &aRandomFunc;
    a.pSomeFunc();
    
    struct AWithDifferentFuncAbility : public A {
        virtual void someFunc() {
           //some new functionality;
        }
    }
    

    继承示例可能是:

    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 */ };
    };
    
    甚至用另一个lambda替换它:

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

    为什么?你找到了一个编译器允许它,并且怀疑它是否是标准C++?@ JuangopangZa只是好奇……还没有编写任何代码,但是“它基本上存储了一个函数指针”。Vtable实现存储一个指向函数指针表的指针,但该表在类的所有对象之间共享。@aschepler这可能是一种比我想象的更节省空间的方法,可能没有Vtable。vtable是虚拟函数的通用解决方案,但不是标准要求的解决方案。不要忘记在运行时交换整个抽象接口的机会。提供状态模式实现非常有用。