Klasy abstrakcyjne są sposobem na osiągnięcie abstrakcji w C++. Abstrakcja w C++ to proces ukrywania wewnętrznych szczegółów i pokazywania tylko funkcjonalności. Abstrakcję można osiągnąć na dwa sposoby:
- Klasa abstrakcyjna
- Interfejs
Klasa abstrakcyjna i interfejs mogą mieć abstrakcyjne metody, które są niezbędne do abstrakcji.
Dlaczego potrzebujemy klasy abstrakcyjnej?
Zrozummy to na przykładzie z życia wziętego. Powiedzmy, że mamy klasę, zwierzę śpi, zwierzę wydaje dźwięk itd. Na razie rozważam tylko te dwa zachowania i tworzę klasę Animal z dwiema funkcjami sound()
i sleeping()
.
Teraz wiemy, że odgłosy zwierząt są inne. Kot mówi „miau”, pies mówi „hau”. Więc jaką implementację podaję w Animal
klasa dla funkcji sound()
, jedynym i poprawnym sposobem na zrobienie tego byłoby uczynienie tej funkcji czystą abstrakcją, tak aby nie musiałem podawać implementacji w klasie Animal, ale wszystkie klasy, które dziedziczą klasę Animal, muszą dać implementację tej funkcji. W ten sposób zapewniam, że wszystkie Zwierzęta mają dźwięk, ale mają swój unikalny dźwięk.
#include <iostream> using namespace std; class Shape { public: virtual void draw()=0; }; class Rectangle : Shape { public: void draw() { cout < <"drawing rectangle..." < <endl; } }; class Circle : Shape { public: void draw() { cout <<"drawing circle..." < <endl; } }; int main( ) { Rectangle rec; Circle cir; rec.draw(); cir.draw(); return 0; }
Wyjście:
drawing rectangle... drawing circle...
Zasady klasy abstrakcyjnej
- Jak widzieliśmy, każda klasa, która ma czystą funkcję wirtualną jest klasą abstrakcyjną.
- Możemy utworzyć wskaźnik i referencję bazowej klasy abstrakcyjnej wskazuje na instancję klasy potomnej.
- Klasa abstrakcyjna może mieć konstruktory.
- Jeżeli klasa pochodna nie implementuje czystej funkcji wirtualnej klasy nadrzędnej, wówczas klasa pochodna staje się abstrakcyjna.