Putem avea funcții virtuale statice? Dacă nu, atunci DE CE? [duplicat] (Programare, C++, Metode Statice, Funcții Virtuale)

Jatin a intrebat.

Posibil duplicat:
Membrii virtuali statici din C++?

Putem avea funcții virtuale statice? Dacă nu, atunci DE CE?

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

Comentarii

  • O soluție posibilă este de a crea o metodă statică (dar nu virtuală) în clasa de bază și de a o face să apeleze metoda statică echivalentă în clasa derivată. În acest fel, se păstrează încapsularea și polimorfismul. –  > Por anni.
2 răspunsuri
Oliver Charlesworth

Nu, pentru că nu are niciun sens în C++.

Funcțiile virtuale sunt invocate atunci când aveți un pointer/referință la o instanță a unei clase. Funcțiile statice nu sunt legate de o anumită instanță, ci de o clasă. C++ nu are pointeri la clasă, deci nu există niciun scenariu în care ați putea invoca o funcție statică în mod virtual.

Comentarii

  • „Nu are niciun sens”? Dar metodele de clasă din Python? –  > Por user541686.
  • 37

  • Limbajul ar putea decide cu ușurință să adauge un tabel de funcții virtuale statice pentru fiecare clasă –  > Por Inverse.
  • @OliCharlesworth: Atunci când aveți un fel de fabrică (de exemplu, un constructor virtual), cred că ar putea avea sens. –  > Por user541686.
  • @OliCharlesworth: Corect. Și nu există niciun motiv pentru care nu ar putea exista – doar că nu se întâmplă să existe. Dar cu siguranță are sens (și ar fi util). –  > Por user541686.
  • Cu tot respectul, membrii statici virtuali au sens pentru anumite utilizări și pentru anumite persoane. @OliverCharlesworth, luați în considerare reformularea răspunsului dvs. sau elaborarea mai detaliată. Da, îmi dau seama că a fost acceptat, dar, ei bine – așa cum este, nu este adevărat. –  > Por einpoklum.
Kerrek SB

Asta nu ar avea sens. Ideea de virtual este că acestea sunt expediate pe baza tipului dinamic al instanței obiectului pentru care sunt apelate. Pe de altă parte, funcțiile statice nu sunt legate de nicio instanță și sunt mai degrabă o proprietate a clasă. Prin urmare, nu are sens ca acestea să fie virtuale. Dacă este necesar, puteți utiliza un distribuitor non-static:

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); }
};

Utilizare:

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

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

Comentarii

    22

  • Continuați să spuneți că „nu are sens”, dar exemplul pe care îl oferiți arată că ar putea fi un lucru rezonabil pentru un limbaj să decidă să susțină – apelarea unei funcții statice într-o clasă derivată. –  > Por Inverse.
  • @Inverse ce altceva ar putea Base fi în timpul execuției, cu excepția Base? –  > Por Seth Carnegie.
  • Poate avea un sens dacă funcția este pur virtuală CU un corp. Atunci compilatorul ar da erori dacă nu o supraîncărcați în clasa derivată. Gândiți-vă, de exemplu, la o funcție getInstance() pentru a crea un singleton. S-ar putea să doriți să aveți un contract care să prevadă că fiecare clasă care derivă din această bază trebuie să aibă o funcție getInstance(). Vreți ca compilatorul să verifice acest lucru pentru dumneavoastră. –  > Por xryl669.
  • 50

  • La fiecare întrebare despre C++ de pe SO se răspunde cu „pentru că nu are sens”? Tocmai am creat o metodă virtuală pentru că trebuia să fie suprascrisă, apoi mi-am dat seama că nu era așa (și într-adevăr nu trebuie) să atingă nicio dată de instanță, așa că am adăugat static la aceasta, și așa am ajuns pe această pagină. Acest răspuns oferă o soluție de rezolvare (+1), dar nu răspunde la întrebare, deoarece „nu are sens” este pur și simplu greșit. –  > Por sh1.
  • static nu înseamnă doar că poate fi apelat fără o instanță a clasei; este, de asemenea, o promisiune că nu va accesa this. Se apropie oarecum de o funcție pură (cum ar fi constexpr, care, aparent, interzice și virtual). O funcție poate fi atât pură (în sens matematic), cât și virtuală. C++ impune doar ca o astfel de funcție să primească un semn fals this pointer care elimină posibilitatea de a impune static contractului asupra claselor derivate. –  > Por sh1.