【发布时间】:2011-02-12 21:23:42
【问题描述】:
在 C++ 中不能声明静态虚函数,也不能将非静态函数强制转换为 C 风格的函数指针。
现在,我有一个简单的 C SDK,它大量使用函数指针。
我必须用几个函数指针填充一个结构。我打算使用带有一堆静态纯虚方法的抽象类,并在派生类中重新定义它们并用它们填充结构。直到那时我才意识到静态虚拟在 C++ 中是不允许的。
此外,此 C SDK 函数签名没有 userData 参数。
有什么好的选择吗?我能想到的最好的方法是在每个派生类中定义一些纯虚方法 GetFuncA()、GetFuncB()...以及一些静态成员 FuncA()/FuncB(),这些将由 GetFuncX() 返回。然后抽象类中的函数会调用这些函数来获取指针并填充结构。
编辑 回答 John Dibling,能够做到这一点真是太好了:
class Base
{
FillPointers() { myStruct.funA = myFunA; myStruct.funB = myFunB; ...}
private:
CStruct myStruct;
static virtual myFunA(...) = 0;
static virtual myFunB(...) = 0;
};
class Derived1 : public Base
{
Derived1() { FillPointers(); }
static virtual myFunA(...) {...};
static virtual myFunB(...) {...};
};
class Derived2 : public Base
{
Derived2() { FillPointers(); }
static virtual myFunA(...) {...};
static virtual myFunB(...) {...};
};
int main()
{
Derived1 d1;
Derived2 d2;
// Now I have two objects with different functionality
}
【问题讨论】:
-
不允许使用静态虚函数是有充分理由的。如果你有一个包含纯虚函数的类,它就会变成抽象的。抽象类无法实例化,因此不存在调用这些函数的风险。但是,如果您允许静态虚拟,它们可能会在不实例化的情况下从类中调用。没有什么可以阻止它们在定义之前被调用!
-
static函数的想法与纯virtual函数的想法直接相反。也许,如果您解释了您想要实现的目标,而不是您如何尝试实现它,我们可能会为您提供更好的指导。 -
C SDK 是否将上下文指针传递给函数?或者,您一次只需要激活一个处理程序吗?
-
@Jamie:你能发布一些你喜欢写但不能因为没有
static virtual这样的东西而不能写的代码吗? -
简单:初始化派生类的CTor中的指针。实际上并没有那么多额外的代码。
标签: c++ static virtual function-pointers