Можем ли мы иметь статические виртуальные функции? Если нет, то ПОЧЕМУ?
class X
{
public:
virtual static void fun(){} // Why we cant have static virtual function in C++?
};
Ответ 1
Нет, потому что это не имеет никакого смысла в С++.
Виртуальные функции вызывается, когда у вас есть указатель/ссылка для экземпляра класса. Статические функции не привязаны к конкретному экземпляру, они привязаны к классу. С++ не имеет указателей на класс, поэтому нет сценария, в котором вы могли бы фактически вызвать статическую функцию.
Ответ 2
Это не имеет смысла. Точка виртуальных функций-членов состоит в том, что они отправляются на основе динамического типа экземпляра объекта, на который они вызываются. С другой стороны, статические функции не связаны ни с какими экземплярами и скорее являются свойством класса. Таким образом, для них нет смысла быть виртуальными. Если необходимо, вы можете использовать нестатический диспетчер:
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);