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是虚拟函数的通用解决方案,但不是标准要求的解决方案。不要忘记在运行时交换整个抽象接口的机会。提供状态模式实现非常有用。