在C++中是否有可能拥有一个static和virtual?的成员函数?显然,没有一种直接的方法(static virtual member();编译错误),但是至少有一种方法可以达到同样的效果吗?
IE:
struct Object
{
struct TypeInformation;
static virtual const TypeInformation &GetTypeInformation() const;
};
struct SomeObject : public Object
{
static virtual const TypeInformation &GetTypeInformation() const;
};
Run Code Online (Sandbox Code Playgroud)
这是有道理的使用GetTypeInformation()上的一个实例(都object->GetTypeInformation())和一类(SomeObject::GetTypeInformation()),它可以为模板,比较有用和重要.
我能想到的唯一方法包括编写两个函数/一个函数和一个常量,每个类,或使用宏.
还有其他方法吗?
在C++中,为C API回调使用静态成员函数指针是安全/可移植的吗?静态成员函数的ABI是否与C函数相同?
我有一个抽象的基类
class IThingy
{
virtual void method1() = 0;
virtual void method2() = 0;
};
Run Code Online (Sandbox Code Playgroud)
我想说 - "所有提供具体实例化的类都必须提供这些静态方法"
我很想做
class IThingy
{
virtual void method1() = 0;
virtual void method2() = 0;
static virtual IThingy Factory() = 0;
};
Run Code Online (Sandbox Code Playgroud)
我知道没有编译,无论如何它还不清楚如何使用它,即使它编译.无论如何我只能这样做
Concrete::Factory(); // concrete is implementation of ITHingy
Run Code Online (Sandbox Code Playgroud)
根本没有在基类中提到工厂.
但我觉得应该有一些表达我希望实现注册的合同的方式.
这有一个众所周知的习语吗?或者我只是把它放在评论中?也许我不应该试图强迫这个
编辑:当我输入问题时,我觉得自己模糊不清.我觉得应该有一些方法来表达它.伊戈尔给出了一个优雅的答案,但实际上它表明它确实无济于事.我最终还是要做
IThingy *p;
if(..)
p = new Cl1();
else if(..)
p = new Cl2();
else if(..)
p = new Cl3();
etc.
Run Code Online (Sandbox Code Playgroud)
我想像c#,python或java这样的反射语言可以提供更好的解决方案
我在覆盖基本类的静态方法方面遇到了一些问题,但整个问题非常复杂且太长(游戏引擎中资源管理的普遍化),所以这里有一个简化版本:
template<class T>
class base
{
static void bar()
{ printf("bar"); }
public:
static void foo()
{ bar(); }
};
class derived : public base<int>
{
static void bar()
{ printf("baz"); }
};
int main() { derived::foo(); }
Run Code Online (Sandbox Code Playgroud)
上面的代码在我的情况下输出"bar",我希望它输出"baz".我该怎么办呢?似乎无论我尝试什么,base :: foo()总是调用base :: bar().我的设计可能有问题.我从未遇到过这个问题 - 我该如何解决?
我首先要说的是,我明白只有非静态成员函数可以是虚拟的,但这就是我想要的:
出于内存管理的目的(这是一个有限ram的嵌入式系统),我希望静态分配重写函数.我接受这样的结果:使用静态函数,我将如何操作函数中的数据.
我目前的想法是,我可以通过使其成为实际上是静态的函数的包装来保持轻量级重载函数.
请不要告诉我,我需要重新思考我的设计.这就是我提出这个问题的原因.如果您想告诉我我最好使用c并使用回调,请指导我阅读一些阅读材料来解释使用面向对象方法的缺陷.有面向对象的设计模式是否符合我列举的要求?