我们能否拥有一个虚拟的静态方法?(C++)

46

可能是重复问题:
C++中的静态虚方法?

我们能在C++中拥有一个虚拟静态方法吗?我尝试编译以下代码:

#include <iostream>
using namespace std;

class A
{
public:
    virtual static void f() {cout << "A's static method" << endl;}
};

class B :public A
{
public:
    static void f() {cout << "B's static method" << endl;}
};

int main()
{
    /* some code */
    return 0;
}

但编译器报错:

member 'f' cannot be declared both virtual and static

所以我猜答案是否定的,但为什么呢?

谢谢, Ron


1
没有真正的原因,这只是在C++中不被支持。(在Python中可以工作:https://ideone.com/fWtTUi)- 您可以创建一个虚拟包装器来包装一个静态方法:一个忽略对象并将调用转发到静态方法的虚拟方法。 - not-a-user
4个回答

60

在一个类中,函数前面添加static表示该函数不需要对象来进行操作。而virtual则意味着该函数的具体实现取决于调用它的对象的类型。因为静态成员函数没有调用对象,所以在同一个函数上同时使用staticvirtual是没有意义的。


5
你的答案是正确的,但是你的解释有误。你可以使用一个对象来确定调用哪个静态方法。在Python中,它的工作原理是这样的:https://ideone.com/fWtTUi - not-a-user
2
@not-a-user 在C++中,您还可以从对象中调用静态函数,因此您可以执行f.static_function()以及F::static_function()(我说不需要对象,而不是不能调用)。但是你是对的 - 在我们有一个对象的情况下,C++可以使用虚表来查找适当的函数 - 在这种情况下,虚静态将是有意义的。正如您所说,重载可以用于将虚拟调用转发到正确的静态函数(或者编译器是否认为这是模棱两可的?) - Michael Anderson

3

不要认为这是可能的,因为你可以在没有A对象的情况下调用A::F();。将其设置为虚拟和静态将意味着矛盾。


3
啊哈,那么静态意味着*this不存在,虚拟意味着方法有一个this指针。将两者结合在一起就会产生矛盾。很好 :) 谢谢。 - Ron_s
1
不,这里没有矛盾。在A::F()中,类是硬编码的,而在this->F()中,要调用的正确函数可以通过对象(通过虚函数查找)派生出来。事实是C++不支持这一点。在Python中,它可以直接使用:https://ideone.com/fWtTUi - not-a-user

2
不,static函数就像全局函数,但也在类命名空间内。 virtual意味着继承和在派生类中重新实现 - 你不能重新实现“全局”函数。

1
因为该类没有 this 指针,而是有虚函数查找表。快速谷歌搜索可以让你了解更多关于虚函数查找表的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接