C++ pure virtual function have body [duplikat]

to pytanie ma już odpowiedzi tutaj : Czysta funkcja wirtualna z implementacją (9 odpowiedzi) Zamknięty 1 rok temu .

Czyste funkcje wirtualne (gdy ustawimy = 0) również mogą mieć ciało funkcji.

Jaki jest pożytek, aby zapewnić ciało funkcyjne dla czystych funkcji wirtualnych, jeśli w ogóle nie zostaną wywołane?

Author: Kara, 2011-03-30

3 answers

Twoje założenie, że nie można wywołać czystej funkcji wirtualnej, jest całkowicie błędne. Gdy funkcja jest zadeklarowana jako czysta wirtualna, oznacza to po prostu, że funkcja ta nie może zostać wywołana dynamicznie , poprzez wirtualny mechanizm dyspozytorski. Jednak ta sama funkcja może być łatwo wywołana statycznie, nie-praktycznie, bezpośrednio (bez wirtualnej wysyłki).

W języku C++ nie-wirtualne wywołanie funkcji wirtualnej jest wykonywane, gdy kwalifikowana nazwa funkcja jest używana w wywołaniu, tzn. gdy nazwa funkcji określona w wywołaniu ma postać <class name>::<function name>.

Na przykład

struct S 
{
  virtual void foo() = 0;
};

void S::foo() 
{
  // body for pure virtual function `S::foo`
}

struct D : S 
{
  void foo() 
  {
    S::foo();       
    // Non-virtual call to `S::foo` from derived class

    this->S::foo(); 
    // Alternative syntax to perform the same non-virtual call 
    // to `S::foo` from derived class
  }
};

int main() 
{
  D d;

  d.S::foo(); 
  // Another non-virtual call to `S::foo`
}
 91
Author: AnT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-06 18:57:09

"efektywny C++" powód dla czystej funkcji wirtualnej do mieć ciało: pochodne klasy, które zaimplementuj tę czystą funkcję wirtualną może nazywać tę implementację SMG w ich kodzie. Jeżeli część Kodeksu dwie różne klasy pochodne to podobne wtedy ma sens przenieść go w hierarchii, nawet jeśli funkcja powinna być czysto wirtualna.

Zobacz tutaj .

 28
Author: Prince John Wesley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 04:51:21

Dla większości czystych funkcji wirtualnych, masz rację. Jednak dla czystego Wirtualnego destruktora ważne jest zdefiniowanie odpowiedniej implementacji destruktora:

  • "czysta wirtualna" ma wymagać klas pochodnych do zaimplementowania ich destruktora.
  • twoja implementacja destruktora klasy bazowej jest tak, że pochodne destruktory klasy mogą z powodzeniem "połączyć się" później.
 8
Author: Chris Jester-Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 04:48:07