przypisanie 0 w deklaracji funkcji skladowej klasy

0

Witam

Do czego służy przypisanie zera do funkcji w klasie w jej deklaracji?

np.

class A
{
int func() = 0;
};

Nie moge znalezc info na ten temat,
dzieki za pomoc
pozdrawiam

0

poczytaj o funkcjach virtualnych

0

wlasnie czytam :-)
ale tam nie wyjasniaja dokladnie do czego jest 0 :P

0

B jakoś trzeba oznaczyć, że funkcja jest pure virtual, czyli nie ma ciała, każda dziedzicząca klasa musi sama napisać ciało tej funkcji, nie ma żadnego ogólnego na wszelki wypadek. A zamiast dokładać nowe słowo kluczowe, twórcy postanowili zrobić konstrukcję przypisania do funkcji zera przy deklaracji, co oznacza, że funkcja nie ma ciała i jest pure virtual.

Z tego co pamiętam przynajmniej ;)

0

dzieki, tyle mi wystarczy

reszte juz znajde/doczytam

pozdrawiam

0

Tak, napisanie "=0" oznacza że funkcja będzie czysto wirtualna, a co za tym idzie klasa będzie abstrakcyjna, czyli nie będzie mogła mieć żadnego obiektu. Próba stworzenia obiektu tej klasy zostanie przez kompilator uznana za błąd. Klasa z taką funkcją nadaje się właściwie głównie do dziedziczenia. Trzeba też pamiętać że jeśli w klasie pochodnej nie zdefiniujesz na nowo owej funkcji wirtualnej, to klasa pochodna otrzyma na zasadzie dziedziczenia funkcje z klasy podstawowej i tym samym stanie się też klasą abstrakcyjną.

0

Zainteresuj się też interfejsami - to takie klasy, gdzie każda metoda jest pure virtual.

0

A ten kod co rzuciłeś się nie kompiluje, bo funkcja abstrakcyjna musi być wirtualna.

0
manfredek napisał(a)

A ten kod co rzuciłeś się nie kompiluje, bo funkcja abstrakcyjna musi być wirtualna.

No costy :D

dzieki wszystkim za pomoc

0

B jakoś trzeba oznaczyć, że funkcja jest pure virtual, czyli nie ma ciała, każda dziedzicząca klasa musi sama napisać ciało tej funkcji, nie ma żadnego ogólnego na wszelki wypadek.

Metoda czysto wirtualna może mieć ciało... przykład może mało merytoryczny ale prawdziwy:

#include <iostream>
using namespace std;

struct zuo {
  virtual ~zuo() = 0;
};
zuo::~zuo() {
  cout << "zuo." << endl;
}

struct zuezuo : zuo {
  ~zuezuo();
};
zuezuo::~zuezuo() {
  cout << "zuezuo." << endl;
}

int main () {
  zuezuo zuezuo;
}

I co? Dosyć specyficzna zagrywka dająca klasę abstrakcyjną i pełny destruktor.

0

Należy jednak pamiętać, że jest to ficzer kompilatorów. Standard zabrania takiej konstrukcji.

0
Bula napisał(a)

Należy jednak pamiętać, że jest to ficzer kompilatorów. Standard zabrania takiej konstrukcji.

Bzdura, to jest właśnie standardowa konstrukcja z ISO IEC 14882 czyli innymi słowy ANSI\ISO C++. Nie chce Ci się standardu czytać? Sprawdź sobie na demo sztandarowego kompilatora C++, w 100% zgodnego ze standardem, tylko nie zapomnij wyłączyć rozszerzeń i wybrać ISO-03... http://www.comeaucomputing.com/tryitout/

Na drugi raz sprawdź zanim napiszesz, byłem ciekaw jak szybko zjawi się podobny znawca standardu... który to już raz za mniej znane aspekty języka obrywa mi się, że stosuję rozszerzenie języka?

0

Nie chce Ci się standardu czytać?

Chce. I to właśnie mnie zmyliło, bo standard mówi, że deklaracja funkcji abstrakcyjnej nie może posiadać ciała, co wcale nie oznacza, że funkcja abstrakcyjna nie może posiadać ciała.

Innymi słowy to jest nieprawidłowe:

class C {
  virtual void foo() = 0 {};
}

A to jest prawidłowe:

class C {
  virtual void foo() = 0;
}
void C::foo() {}

Co więcej czytając przeoczyło mi się:

A pure virtual function need be defined only if explicitly called with the qualified-id syntax (5.1).

Sorry, za zamieszanie.

PS. @deus: Nie musisz od razu na człowieka naskakiwać, wystarczy, że sprostujesz czyiś błąd.

0

@up: akurat deus'a rozumiem, bo ostatnio często ktoś się powołuje na standard go nie znając. W tym przypadku akurat Buła popełniłeś inny błąd, nie zrozumiałeś do końca (trochę to podchwytliwe było), ale niech słowa deus'a będą przestrogą dla innych !

Ciekaw jestem dlaczego tak jest (ciało tak, ale nie w deklaracji). Złoty środek, czy może ułatwienie dla kompilatorów ?

0
adf88 napisał(a)

Ciekaw jestem dlaczego tak jest (ciało tak, ale nie w deklaracji). Złoty środek, czy może ułatwienie dla kompilatorów ?

trudno powiedziec, nie spotkalem sie z sensownym wyjasnieniem. podejrzewam ze wynika to zarowno z 'ulatwienia dla kompilatorow' jak i by byla wizualna podpowiedz dla 'uzytkownika' zeby widzial wyraznie co trzeba nadpisac --- jesli kod wygladalby tak:

class abc
{
    virtual x(int a, float b, double c) const = 0
    {  adsadfsd
       fsdfsdf
       dfsfdsdfsdf
    }
};

owo = 0 mozna by bylo latwo przegapic calkiem

1 użytkowników online, w tym zalogowanych: 0, gości: 1