猿问

C ++静态虚拟成员?

在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;

};

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


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


还有其他解决方案吗?



郎朗坤
浏览 493回答 3
3回答

qq_遁去的一_1

不,没有办法,因为打电话时会发生什么Object::GetTypeInformation()?它不知道要调用哪个派生类版本,因为没有与之关联的对象。您必须使其成为一个非静态虚拟函数才能正常工作。如果您还希望能够在没有对象实例的情况下非虚拟地调用特定派生类的版本,则还必须提供第二个冗余的静态非虚拟版本。

慕姐8265434

许多人说这是不可能的,我会更进一步,说这没有意义。静态成员是仅与类无关的任何实例。虚拟成员是不与任何类直接相关,而仅与实例直接相关的东西。因此,静态虚拟成员将与任何实例或任何类都不相关。

Smart猫小萌

前几天,我遇到了这个问题:我有一些充满静态方法的类,但我想使用继承和虚拟方法并减少代码重复。我的解决方案是:代替使用静态方法,将单例与虚拟方法一起使用。换句话说,每个类都应包含一个静态方法,您可以调用该方法来获取指向该类的单个共享实例的指针。您可以将真正的构造函数设为私有或受保护的,以便外部代码不会通过创建其他实例来滥用它。实际上,使用单例与使用静态方法非常相似,不同之处在于可以利用继承和虚拟方法。
随时随地看视频慕课网APP
我要回答