Pojedynczy dziedziczenie
W "pojedynczy dziedziczenia," wspólny formularz dziedziczenie klas mają tylko jednej klasy podstawowej.Należy wziąć pod uwagę relacje przedstawione na poniższym rysunku.
Prosty wykres Single dziedziczenie
Uwaga postęp od ogólne do konkretnych na rysunku.Znaleziono w projekcie większość hierarchii klas innego atrybutu wspólnej jest, iż w klasie pochodnej ma "kind of" relacji z klasą bazową.Na rysunku Book jest rodzajem z PrintedDocumenti PaperbackBook jest rodzajem z book.
Jednego elementu Uwaga na rysunku: Book jest zarówno klasy pochodne (z PrintedDocument) i klasy podstawowej (PaperbackBook jest pochodną Book).W poniższym przykładzie pokazano szkieletowych deklaracji hierarchii klas:
// deriv_SingleInheritance.cpp
// compile with: /LD
class PrintedDocument {};
// Book is derived from PrintedDocument.
class Book : public PrintedDocument {};
// PaperbackBook is derived from Book.
class PaperbackBook : public Book {};
PrintedDocumentuważa się za klasy "bezpośrednie base" do Book; klasy "pośredniego base" jest PaperbackBook.Różnica polega na że bezpośrednia klasa podstawowa pojawi się na liście podstawowej w deklaracji klasy i pośrednich base nie.
Klasa podstawowa, z którego wywodzi się każdej klasy jest zadeklarowany jako przed zgłoszeniem w klasie pochodnej.Nie jest wystarczająca do odwoływania się do przodu deklarację klasy podstawowej; musi być kompletne zgłoszenie.
W poprzednim przykładzie specyfikatora dostępu publicznych jest używana.Znaczenie dziedziczenie publiczne, prywatne i chronionych opisana jest w Członkowskich dostępu formantu.
Klasa może służyć jako klasa bazowa dla wielu określonych grup, jak zostało to przedstawione na poniższym rysunku.
Przykładowy wykres acykliczne ukierunkowane
W diagramie pokazano powyżej o nazwie "ukierunkowanych wykres acykliczne" (lub "DAG"), niektóre z klas są klas bazowych do więcej niż jednej klasy pochodnej.Jednakże odwrotnej nie jest prawdziwe: istnieje tylko jeden bezpośrednia klasa podstawowa dla wszelkie podane otrzymane klasy.Wykres na rysunku przedstawia strukturę "pojedynczy dziedziczenia".
[!UWAGA]
Ukierunkowane acykliczne wykresy nie są unikatowe dla pojedynczego dziedziczenie.Służą one także do zobrazowania dziedziczenie wielu wykresów.W tym temacie są omówione w Wielokrotne dziedziczenie.
W dziedziczenia w klasie pochodnej zawiera członkowie klasy bazowej plus nowych członków, które można dodawać.W efekcie klasy pochodnej można zapoznać się członkowie klasy bazowej (chyba że ci członkowie definiowane są w klasie pochodnej).Operator zakresu rozdzielczość (::) może służyć do odwoływania się do członków bezpośredniego lub pośredniego klas podstawowych, gdy te elementy członkowskie został ponownie zdefiniowany w klasie pochodnej.Rozważmy następujący przykład:
// deriv_SingleInheritance2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;
class Document {
public:
char *Name; // Document name.
void PrintNameOf(); // Print name.
};
// Implementation of PrintNameOf function from class Document.
void Document::PrintNameOf() {
cout << Name << endl;
}
class Book : public Document {
public:
Book( char *name, long pagecount );
private:
long PageCount;
};
// Constructor from class Book.
Book::Book( char *name, long pagecount ) {
Name = new char[ strlen( name ) + 1 ];
strcpy_s( Name, strlen(Name), name );
PageCount = pagecount;
};
Należy zauważyć, że konstruktora dla Book, (Book::Book), ma dostęp do członka danych, Name.W programie, obiekt typu Book mogą być tworzone i używane w następujący sposób:
// Create a new object of type Book. This invokes the
// constructor Book::Book.
Book LibraryBook( "Programming Windows, 2nd Ed", 944 );
...
// Use PrintNameOf function inherited from class Document.
LibraryBook.PrintNameOf();
Jak pokazano w powyższym przykładzie, członek klasy, dziedziczone dane i funkcje są używane identycznie.Jeśli implementacji dla klasy Book wzywa do reimplementation z PrintNameOf funkcji, funkcja, która należy do Document klasy można wywołać tylko przy użyciu zakres rozdzielczości (::) operatora:
// deriv_SingleInheritance3.cpp
// compile with: /EHsc /LD
#include <iostream>
using namespace std;
class Document {
public:
char *Name; // Document name.
void PrintNameOf() {} // Print name.
};
class Book : public Document {
Book( char *name, long pagecount );
void PrintNameOf();
long PageCount;
};
void Book::PrintNameOf() {
cout << "Name of book: ";
Document::PrintNameOf();
}
Wskaźniki i odniesienia do klas pochodnych można niejawnie konwertować wskaźniki i odniesienia do ich podstawowych klas Jeżeli jest dostępny, jednoznaczne klasy podstawowej.Poniższy kod demonstruje tę koncepcję za pomocą wskaźników (ta sama zasada stosuje się do odwołania):
// deriv_SingleInheritance4.cpp
// compile with: /W3
struct Document {
char *Name;
void PrintNameOf() {}
};
class PaperbackBook : public Document {};
int main() {
Document * DocLib[10]; // Library of ten documents.
for (int i = 0 ; i < 10 ; i++)
DocLib[i] = new Document;
}
W poprzednim przykładzie tworzone są różnych typów.Jednakże ponieważ te typy są pochodzące z Document klasy, istnieje niejawna konwersja do Document *.W związku z powyższym DocLib jest "Lista heterogenicznych" (w którym nie wszystkie obiekty są tego samego typu listy) zawierającą różne rodzaje obiektów.
Ponieważ Document klasa ma PrintNameOf funkcji, można drukować nazwę każdej książki w bibliotece, chociaż może ona pominąć niektóre informacje specyficzne dla typu dokumentu (liczba dla stron Book, liczba bajtów dla HelpFile, i tak dalej).
[!UWAGA]
Wymuszanie klasy podstawowej do implementacji funkcji, takich jak PrintNameOf często nie jest najlepszym projektu.Funkcje wirtualnych oferuje inne alternatywy dla projektu.