Lekcje modułu (1/2)
Dziedziczenie w C++
Dziedziczenie (inheritance) to jeden z filarów programowania zorientowanego obiektowo (OOP). Umożliwia nowej klasie (zwanej klasą pochodną lub podrzędną) przejęcie składowych (atrybutów i metod) istniejącej klasy (zwanej klasą bazową lub nadrzędną), co sprzyja ponownemu użyciu kodu.
Podstawowa składnia
W C++ dziedziczenie określa się za pomocą operatora : po nazwie klasy pochodnej, po którym następuje typ dostępu (zazwyczaj public) oraz nazwa klasy bazowej.
class Shape {
public:
void setColor(std::string c) {
color = c;
}
protected:
std::string color; // Accessibile dalle classi derivate
};
// Rectangle eredita public-mente da Shape
class Rectangle : public Shape {
public:
double getArea() {
return width * height;
}
private:
double width {0.0};
double height {0.0};
};
Specyfikatory dostępu: protected
Oprócz specyfikatorów public i private, dziedziczenie wprowadza specyfikator protected:
- Składowe
privateklasy bazowej nie są bezpośrednio dostępne z poziomu klasy pochodnej. - Składowe
protectedklasy bazowej są niedostępne z zewnątrz, ale są bezpośrednio dostępne wewnątrz klas pochodnych.
Inicjalizacja klasy bazowej
Konstruktory nie są dziedziczone automatycznie. Podczas tworzenia instancji klasy pochodnej najpierw wywoływany jest konstruktor klasy bazowej. Jeśli klasa bazowa wymaga argumentów, musimy go jawnie wywołać na liście inicjalizacyjnej (member initializer list) konstruktora klasy pochodnej.
class Parent {
public:
Parent(int x) {
std::cout << "Parent: " << x << std::endl;
}
};
class Child : public Parent {
public:
// Chiamata esplicita al costruttore Parent
Child(int x, int y) : Parent(x) {
std::cout << "Child: " << y << std::endl;
}
};
Spróbuj sam
Utwórz klasę Dog, która dziedziczy w trybie public po klasie Animal. Klasa Dog musi zawierać publiczną metodę play() wypisującą 'Playing' za pomocą std::cout.
Pokaż wskazówkę
Użyj składni `:` z następującym po nim `public Animal`, aby rozszerzyć klasę bazową, a następnie napisz metodę `play()`.
Rozwiązanie dostępne po 3 próbach
Uzupełnij klasę Car, dziedzicząc po Vehicle. Napisz konstruktor dla Car, który przyjmuje std::string b i przekazuje go do konstruktora klasy Vehicle za pomocą listy inicjalizacyjnej.
Pokaż wskazówkę
W konstruktorze klasy `Car` użyj składni `: Vehicle(b)` bezpośrednio po nawiasach parametrów, aby przekazać inicjalizację marki (brand) do klasy bazowej.
Rozwiązanie dostępne po 3 próbach