可能是重复问题:
C++中的静态虚函数?
我们能否拥有静态虚函数?如果不能,那么为什么?
class X
{
public:
virtual static void fun(){} // Why we cant have static virtual function in 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);
static
不仅意味着可以在没有类实例的情况下调用,它还承诺不会访问 this
。这有点类似于一个纯函数(例如 constexpr
,它显然也禁止使用 virtual
)。一个函数既可以是纯函数(在数学意义上),同时也可以是虚函数。C++ 只是规定这样的函数接收一个虚假的 this
指针,这就取走了在派生类上强制执行 static
契约的可能性。 - sh1static virtual
的实现显然不会像普通的静态方式那样工作,但“virtual”所做的事情不止一个部分。在这种情况下,他正在寻找编译器错误,如果未定义静态函数,则会出现编译器错误。编译器可以轻松地忽略vtable而执行此操作。多功能动词是真实存在的。 - Seph Reed