Подтвердить что ты не робот

Можем ли мы иметь статические виртуальные функции? Если нет, то ПОЧЕМУ?

Возможный дубликат:
Статические виртуальные элементы С++?

Можем ли мы иметь статические виртуальные функции? Если нет, то ПОЧЕМУ?

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

Ответ 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);