Funkcja czysto wirtualna

0

Dwa pytania. Przeczytałem że wersja funkcji wirtualnej w klasie abstrakcyjnej nigdy się nie wykona, jednak gdy wywołam funkcję wypisz z klasy podstawowej, w klasie pochodnej, wszystko zadziała poprawnie. Czego nie zrozumiałem? W klasie abstrakcyjnej także należy przeciążyć operatory i dodać konstruktor kopiujący? Wydaje mi się że należy ją przystosować do normalnego użytku, jednak pewności nie mam, czy przypadkiem o to wszystko nie powinny się martwić metody klas pochodnych.

 
class point(){
        protected:
          //skladniki klasy abstrakcyjnej
        public:
         //konstruktory, wirtualny destruktor, metody, operatory
         virtual void wypisz() = 0{
         //ciało funkcji
         }
}

class pochodna(): public point{
        protected:
          //skladniki klasy abstrakcyjnej
        public:
         //konstruktory, wirtualny destruktor, metody, operatory
         virtual void wypisz() {
         point::wypisz();
         //reszta funkcji
         }
}
0

Tak na wstępie - masz w tym co podałeś kilka błędów syntaksycznych.
Owszem takie wywołanie kompilator przepuści zaś linkier nie, będzie domagał się tej funkcji.
Destruktor wirtualny przy dziedziczeniu musi być obowiązkowo, nawet jeżeli nie masz nić do zwolnienia w klasie bazowej.
Co do reszty to tak jak dla każdej innej klasy: Jak masz część dynamiczną to muszą być 5 elementów (jak u chińczyków):

  1. private lub protected
  2. konstruktor kopiujący
  3. konstruktor dodatkowy ale nie kopiujący
  4. operator =
  5. destruktor
0

Hmmm linker miał nie przepuścić czegoś? Tzn. mam program, wygląda na działający poprawnie, zawierający klasę abstrakcyjną oraz jej pochodne. Klasy zbudowane są tak jak na podanym przykładzie i program wykonuje się prawidłowo. Podczas wypisywania zawartości klasy pochodnej (korzystając z funkcji wypisz), nie ma żadnych problemów z korzystaniem z funkcji wypisz, należącej do klasy podstawowej. Wszystko fajnie, tylko czy przypadkiem miało to być niemożliwe? W pierwszym poście zapomniałem dodać ze chodzi mi o funkcję czysto wirtualną.

Dodam jeszczy tylko, że wcześniej klasa podstawowa, nie była klasą abstrakcyjną, zmana polegała tylko na dodaniu w definicji klasy "=0" do wirtualnej funkcji wypisz.

0

Co miało być niemożliwe? Wywołanie funkcji czysto wirtualnej? To nie jest prawda.

Nie można stworzyć obiektu klasy abstrakcyjnej, czyli obiektu klasy, która posiada funkcje czysto wirtualne. To wszystko. Natomiast można statyczne (czyli bez wykorzystania polimorfizmu, nie chodzi o słowo kluczowe static) wywołać funkcję czysto wirtualną która posiada ciało. (W zasadzie to w ten sposób można też taką, która nie ma, ale wtedy linker zwróci błąd).

Poza tym ten Twój kod ma masę błędów co już zauważył @_13th_Dragon.

0

Dziękuję za odpowiedzi :)

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