C++ 我们可以有一个静态的虚拟函数吗?若否,原因为何?

C++ 我们可以有一个静态的虚拟函数吗?若否,原因为何?,c++,static-methods,virtual-functions,C++,Static Methods,Virtual Functions,可能重复: 我们可以有一个静态的虚拟函数吗?若否,原因为何 class X { public: virtual static void fun(){} // Why we cant have static virtual function in C++? }; 不,因为C++中没有任何意义。 当您有指向类的实例的指针/引用时,将调用虚拟函数。静态函数不绑定到特定实例,而是绑定到类。C++没有指向类的指针,所以没有任何一种方法可以在实际中调用静态函数。 这是没有意义的。虚拟成员函

可能重复:

我们可以有一个静态的虚拟函数吗?若否,原因为何

class X
{
public:
       virtual static void fun(){} // Why we cant have static virtual function in C++?
};

不,因为C++中没有任何意义。


当您有指向类的实例的指针/引用时,将调用虚拟函数。静态函数不绑定到特定实例,而是绑定到类。C++没有指向类的指针,所以没有任何一种方法可以在实际中调用静态函数。

这是没有意义的。虚拟成员函数的要点是,它们是根据调用它们的对象实例的动态类型进行调度的。另一方面,静态函数与任何实例都不相关,而是类的一个属性。因此,对他们来说,虚拟是没有意义的。如果必须,可以使用非静态调度程序:

struct Base
{
    static void foo(Base & b) { /*...*/ }

    virtual ~Base() { }
    virtual void call_static() { foo(*this); /* or whatever */ }
};

struct Derived : Base
{
     static void bar(int a, bool b) { /* ... */ }

     virtual void call_static() { bar(12, false); }
};
用法:

Base & b = get_instance();
b.call_static();   // dispatched dynamically

// Normal use of statics:
Base::foo(b);
Derived::bar(-8, true);

“没有任何意义”?Python中的类方法呢?该语言可以很容易地决定为每个类添加一个静态虚拟函数表class@OliCharlesworth:当你有某种工厂(如虚拟构造函数)时,我认为这可能是有意义的。@OliCharlesworth:对。没有理由说它不存在,只是它不会发生在你身上。但它肯定是有意义的(而且会很有用)。恕我直言,虚拟静态成员对于某些用途和某些人来说是有意义的@奥利弗查尔斯沃思,考虑改写你的答案或详细阐述。是的,我知道它被接受了,但是,从它的立场来看,它不是真的。你一直说它“毫无意义”但您提供的示例表明,语言决定支持它可能是合理的——在派生类中调用静态函数。@相反,
Base
在运行时除了
Base
,还能是什么?
Base
?如果函数是纯虚体函数,它会有一种感觉。如果没有在派生类中重载编译器,那么编译器将出现错误。例如,可以考虑一个getInstance()函数来生成singleton。您可能希望有一个约定,即从这个基派生的每个类都必须有一个getInstance()。你想让编译器检查你的问题。每个C++问题都是用“因为它没有意义”回答的吗?我只是创建了一个虚拟方法,因为它必须被重写,然后我意识到它没有(而且真的不能)接触任何实例数据,因此添加了静态数据,这就是我在本页上的结果。这个答案提供了一个变通方法(+1),但是没有回答这个问题,因为“它毫无意义”是完全错误的。
static
不仅仅意味着可以在没有类实例的情况下调用它;它还承诺不会访问此。它在某种程度上近似于一个纯函数(比如
constepr
,这显然也禁止
virtual
)。函数既可以是纯函数(在数学意义上),也可以是虚函数。C++只要求这样的函数接收一个虚假的代码>这个静态< /代码>契约强加的可能性。一个可能的解决方案是在基类中创建一个静态方法(但不是虚拟的),并在派生类中调用静态方法。这样,您仍然可以维护封装和多态性。