我发现了一些关于我上述问题的陈述,但有一些不同的说法:
哪一个是正确的,是出于什么原因?
发布于 2020-09-08 11:30:50
不,静态函数在C++中不能是虚拟的。
如果函数不依赖于类的任何成员,但在某种意义上依赖于类型,则有时会有用:
struct Animal
{
static virtual std::string whatNoiseDoIMake() = 0;
};
struct Dog : Animal
{
static std::string whatNoiseDoIMake()
{
return "woof"s;
}
};之所以它不是语言的一部分,是因为它没有被C++标准委员会提议和接受。我的例子可以使用类型特征来解决,这削弱了允许这样的构造的理由。
至于const,这实际上是关于修改非mutable类成员的可能性。很难编写一个有意义的const static成员函数示例。也许它可以应用于static成员,但这样的成员无论如何都可以通过::联系到(有趣的是)丢弃了访问说明符。
发布于 2020-09-08 11:37:03
哪个是对的,确切的原因是什么?
第一条语句是正确的,因为静态成员函数不能访问*this指针,它们有一个类范围。静态成员由类的所有实例共享。
在第二个声明中,第一部分是基于意见的,可以说它可能是有用的,@Bathsheba指出。第二部分是正确的。
不管使用这种构造可能有什么意义或优点,标准都清楚为什么不允许使用虚拟静态成员函数:
11.7.2虚拟函数 [class.virtual#11]
[注意:虚拟说明符意味着成员资格,因此虚拟函数不能是非会员(https://timsong-cpp.github.io/cppwp/n4861/dcl.fct.spec)函数。也不能是静态函数,因为虚拟函数调用依赖于特定的对象来决定调用哪个函数。一个类中声明的虚拟函数可以在另一个类中声明为朋友(https://timsong-cpp.github.io/cppwp/n4861/class.friend)。-尾注]
发布于 2020-09-08 11:37:17
不,他们不能。
虚拟成员设计用于处理类的实例。
静态成员不处理实例,它们只涉及类。
如果没有与任何实例的连接,您将如何根据实例(在动态多态中)选择要调用的“虚拟静态”函数?
这只是两个相互排除依赖关系的不同机制。
https://stackoverflow.com/questions/63792776
复制相似问题