Podstawy dziedziczenia
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 48 z 104.
Dziedziczenie pozwala klasie przejąć właściwości i zachowania innej klasy. Klasa, po której dziedziczy się, nazywana jest klasą bazową (lub klasą nadrzędną), a klasa dziedzicząca nazywana jest klasą pochodną (lub klasą podrzędną).
Aby utworzyć klasę pochodną, użyj dwukropka, po którym podaj specyfikator dostępu i nazwę klasy bazowej:
class Animal {
public:
std::string name;
void eat() {
std::cout << name << " is eating" << std::endl;
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << name << " says woof!" << std::endl;
}
};Klasa Dog ma teraz dostęp zarówno do name, jak i do eat() z klasy Animal, a także do własnej metody bark(). Na tym polega dziedziczenie: ponownym wykorzystaniu istniejącego kodu przy jednoczesnym dodawaniu nowych funkcjonalności.
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Odziedziczone z Animal
myDog.bark(); // Zdefiniowane w DogSłowo kluczowe public przed Animal określa typ dziedziczenia. Dziedziczenie publiczne oznacza, że publiczne składowe klasy bazowej pozostają publiczne w klasie pochodnej. Jest to najczęstsza forma dziedziczenia i modeluje relację „jest”: Dog jest Animal.
Wyzwanie
ŁatwyStwórzmy prostą hierarchię pojazdów, która pokaże dziedziczenie w praktyce. Utworzysz bazową klasę Vehicle oraz pochodną klasę Motorcycle, która rozszerza ją o wyspecjalizowane zachowanie.
Rozmieścisz swój kod w trzech plikach:
Vehicle.h: Zdefiniuj bazową klasęVehiclez:- publicznym polem
std::string brand - publicznym polem
int year - publiczną metodą
displayInfo(), która wypisuje markę i rok pojazdu w formacie:Brand: <brand>, Year: <year>
- publicznym polem
Motorcycle.h: Zdefiniuj klasęMotorcycle, która publicznie dziedziczy poVehicle. Ta klasa pochodna powinna dodawać:- publiczne pole
int engineCCokreślające pojemność silnika - publiczną metodę
revEngine(), która wypisuje:<brand> goes vroom vroom!
Klasa
Motorcycleautomatycznie odziedziczy polabrandiyearoraz metodędisplayInfo()z klasyVehicle.- publiczne pole
main.cpp: Wczytaj trzy dane wejściowe (każdą w osobnym wierszu):- Nazwa marki (ciąg znaków)
- Rok (liczba całkowita)
- Pojemność silnika w CC (liczba całkowita)
Utwórz obiekt
Motorcyclei ustaw jego odziedziczone pola (brandiyear), a także jego własne poleengineCC. Następnie wypisz trzy wiersze wynikowe w podanej kolejności: najpierw wywołaj odziedziczoną metodędisplayInfo(), potem samodzielnie wypisz pojemność silnika za pomocąstd::cout << "Engine: " << moto.engineCC << "cc" << std::endl;, a na koniec wywołaj metodęrevEngine()właściwą dla motocykla. To pokazuje dziedziczenie przez użycie zarówno odziedziczonej metody, jak i własnej metody klasy pochodnej.Format wyniku:
Brand: <brand>, Year: <year> Engine: <engineCC>cc <brand> goes vroom vroom!
Na przykład dla danych wejściowych Harley, 2022 i 1200:
Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!Nie zapomnij dodać strażników nagłówka do plików nagłówkowych i użyć #include "Vehicle.h" w nagłówku Motorcycle, aby uzyskać dostęp do klasy bazowej.
Spróbuj swoich sił
#include <iostream>
#include <string>
#include "Motorcycle.h"
using namespace std;
int main() {
string brand;
int year;
int engineCC;
cin >> brand;
cin >> year;
cin >> engineCC;
// TODO: Utwórz obiekt Motorcycle
// TODO: Ustaw jego pola brand, year i engineCC
// TODO: Wywołaj displayInfo(), aby wyświetlić odziedziczone informacje
// TODO: Wypisz informacje o silniku w formacie: Engine: <engineCC>cc
// TODO: Wywołaj revEngine(), aby zademonstrować zachowanie charakterystyczne dla motocykla
return 0;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online