首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态函数在C++中可以是虚拟的吗?

静态函数在C++中可以是虚拟的吗?
EN

Stack Overflow用户
提问于 2020-09-08 11:17:03
回答 6查看 281关注 0票数 4

我发现了一些关于我上述问题的陈述,但有一些不同的说法:

  1. 静态成员函数不能访问类的非静态数据成员/函数。vPTR是非静态数据成员,因此静态成员函数不能访问vPTR.
  2. 不,因为它在C++中没有任何意义。 当您有一个指向类实例的指针/引用时,将调用虚拟函数。静态函数不是绑定到特定实例,而是绑定到类。C++没有指向类的指针,因此不存在实际调用静态函数的场景。

哪一个是正确的,是出于什么原因?

EN

回答 6

Stack Overflow用户

发布于 2020-09-08 11:30:50

不,静态函数在C++中不能是虚拟的。

如果函数不依赖于类的任何成员,但在某种意义上依赖于类型,则有时会有用:

代码语言:javascript
运行
复制
struct Animal
{
    static virtual std::string whatNoiseDoIMake() = 0;
};

struct Dog : Animal
{
    static std::string whatNoiseDoIMake()
    {
        return "woof"s;
    }
};

之所以它不是语言的一部分,是因为它没有被C++标准委员会提议和接受。我的例子可以使用类型特征来解决,这削弱了允许这样的构造的理由。

至于const,这实际上是关于修改非mutable类成员的可能性。很难编写一个有意义的const static成员函数示例。也许它可以应用于static成员,但这样的成员无论如何都可以通过::联系到(有趣的是)丢弃了访问说明符。

票数 4
EN

Stack Overflow用户

发布于 2020-09-08 11:37:03

哪个是对的,确切的原因是什么?

  1. 静态成员函数不能访问类的非静态数据成员/函数。vPTR是非静态数据成员,因此静态成员函数不能访问vPTR.
  2. 不,因为它在C++中没有任何意义。 当您有一个指向类实例的指针/引用时,将调用虚拟函数。静态函数不是绑定到特定实例,而是绑定到类。C++没有指向类的指针,因此不存在实际调用静态函数的场景。

第一条语句是正确的,因为静态成员函数不能访问*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)。-尾注]

票数 2
EN

Stack Overflow用户

发布于 2020-09-08 11:37:17

不,他们不能。

虚拟成员设计用于处理类的实例

静态成员不处理实例,它们只涉及

如果没有与任何实例的连接,您将如何根据实例(在动态多态中)选择要调用的“虚拟静态”函数?

这只是两个相互排除依赖关系的不同机制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63792776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档