C ++静态虚拟成员?

在C ++中有可能具有staticvirtual的成员函数吗? 显然,没有一个简单的方法来做到这一点( static virtual member();是一个编译错误),但至少有一种方法来实现相同的效果?

IE:

struct Object
{
     struct TypeInformation;

     static virtual const TypeInformation &GetTypeInformation() const;
};

struct SomeObject : public Object
{
     static virtual const TypeInformation &GetTypeInformation() const;
};

这是有道理的使用GetTypeInformation()都在一个实例( object->GetTypeInformation()和一个类( SomeObject::GetTypeInformation()它可以为模板进行比较有用和重要。

我能想到的唯一方法就是每个类编写两个函数/一个函数和一个常量,或者使用宏。

其他解决方案?


不,没有办法去做,因为当你调用Object::GetTypeInformation()时会发生什么? 由于没有与之关联的对象,因此无法知道要调用哪个派生类版本。

你必须让它成为一个非静态的虚函数才能正常工作; 如果您还希望能够在没有对象实例的情况下非虚拟地调用特定派生类的版本,则还必须提供第二个冗余静态非虚拟版本。


许多人说这是不可能的,我会更进一步说它不是有意义的。

静态成员是不涉及任何实例的东西,只与类有关。

虚拟成员是不直接与任何类相关的东西,而仅仅是一个实例。

所以一个静态的虚拟成员将是不涉及任何实例或任何类的东西。


有一天我遇到了这个问题:我有一些类充满了静态方法,但我想使用继承和虚拟方法并减少代码重复。 我的解决方案是:

不要使用静态方法,而要使用具有虚拟方法的单例。

换句话说,每个类都应该包含一个静态方法,您可以调用该方法来获取指向该类的单个共享实例的指针。 您可以将真正的构造函数设置为private或protected,以便外部代码不会通过创建其他实例来误用它。

在实践中,使用单例很像使用静态方法,只是可以利用继承和虚拟方法。

链接地址: http://www.djcxy.com/p/54149.html

上一篇: C++ static virtual members?

下一篇: What's the point of @staticmethod in Python?