Freigeben über


Einzelne Vererbung

„Vererbung“ in der einzelnen ein allgemeines Format der Vererbung Klassen nur eine Basisklasse.Betrachten Sie die Beziehung als in der folgenden Abbildung veranschaulicht.

Einfaches Diagramm Einzel-Vererbung

Einfaches Single_Inheritance-Diagramm

Beachten Sie die Weiterentwicklung von Allgemein zu Besonderheiten in der Abbildung.Ein weiteres gemeinsames Attribut, das im Entwurf der meisten Klassenhierarchien gefunden wird, ist, dass die abgeleitete Klasse eine „Typ“ Bezug auf die Basisklasse verfügt.In der Abbildung ist eine Art von BookPrintedDocument, und PaperbackBook ist eine Art book.

Ein anderes Element Beachten Sie in der Abbildung: Book ist eine abgeleitete Klasse von PrintedDocument() und eine Basisklasse (PaperbackBook ist von Bookabgeleitet).Eine skelettartige solchen Deklaration einer Klassenhierarchie wird im folgenden Beispiel gezeigt:

// 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 {};

PrintedDocument wird als eine Basis“ Klasse „verweisen auf Book. Es ist eine indirekte Basisklasse“ Klasse „ PaperbackBook.Der Unterschied besteht darin, dass eine direkte Basisklasse in der Liste eine Klassendeklaration wird und eine indirekte Basisklasse nicht vorhanden ist.

Die Basisklasse, von der alle Klasse abgeleitet ist, wird vor der Deklaration der abgeleiteten Klasse deklariert.Es reicht nicht aus, um eine FORWARD-verweisende Deklaration für eine Basisklasse bereitzustellen. Es muss eine vollständige Deklaration handeln.

Im vorherigen Beispiel wird der Öffentlich Zugriffsspezifizierer verwendet.Die Bedeutung der öffentlichen, privaten und geschützten Vererbung wird in Member-ACCESS-Steuerelement.beschrieben

Eine Klasse kann als Basisklasse für viele bestimmten Klassen fungieren, wie in der folgenden Abbildung dargestellt.

Beispiel des verweisenden azyklischen Diagramms

Beispiel für gerichtetes azyklisches Diagramm

oben im Diagramm angezeigten Textes mit der Bezeichnung „verwiesen hat, azyklisches Diagramm“ (oder „DAG“), einige der Klassen sind Basisklassen für mehr als eine abgeleitete Klasse.Dies stellt die Umkehrung ist jedoch nicht der Fall sein: Es gibt nur eine direkte Basisklasse für jede angegebene abgeleitete Klasse.Das Diagramm in der Abbildung stellt eine Struktur „der einzelnen Vererbung“ dar.

HinweisHinweis

Verwiesene azyklische Diagramme sind nicht eindeutig, Vererbung einzelnen.Sie werden auch verwendet, um darzustellen, um Diagramme Mehrfachvererbungs.In diesem Thema wird in Mehrfachvererbungbehandelt.

Bei der Vererbung enthält die abgeleitete Klasse die Member der Basisklasse sowie alle neuen Member, die Sie hinzufügen.Daher kann eine abgeleitete Klasse die Member der Basisklasse zugreifen (es sei denn, diese Member in der abgeleiteten Klasse neu definiert werden).Der Bereichsauflösungsoperator (::) kann verwendet werden, um Member eines direkten oder indirekten Basisklasse zugreifen, wenn diese Member in der abgeleiteten Klasse neu definiert wurden.Betrachten Sie das folgende Beispiel:

// 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;
};

Beachten Sie, dass der Konstruktor für Book(Book::Book), hat Zugriff auf den Datenmember, Name.In einem Programm kann ein Objekt des Typs Book erstellt und verwendet werden, wie folgt:

//  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();

Wie im vorherigen Beispiel zeigt, sind Klassenmember und geerbte Daten und Funktionen identisch.Wenn die Implementierung für Klassen Book Aufrufe für ein reimplementation der PrintNameOf-Funktion, die Funktion, die der Document-Klasse aufgerufen werden kann, gehört nur über den SCOPE Auflösung (::) - Operator verwendet:

// 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();
}

Zeiger und Verweise auf den abgeleiteten Klassen können den Zeiger und zu den Verweisen auf ihre Basisklassen implizit konvertiert werden, wenn es eine barrierefreie, eindeutige Basisklasse gibt.Im folgenden Code wird dieses Konzept mithilfe der Zeiger (das gleiche Prinzip gilt für Verweise):

// 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;
}

Im vorherigen Beispiel werden verschiedene Typen erstellt werden.Da diese Typen alle von der Document-Klasse abgeleitet sind, eine implizite Konvertierung Document *vorhanden ist.Daher ist DocLib eine heterogene „List“ (eine Liste, in der alle Objekte nicht denselben Typ aufweisen), unterschiedliche Arten von Objekten enthalten.

Da die Document-Klasse eine PrintNameOf-Funktion hat, kann sie den Namen jedes Buchs in der Bibliothek aus zu drucken, obwohl sie möglicherweise einen Teil des spezifischen Informationen zum Typ des Dokuments Seitenzähler (nicht für Book, Anzahl von Bytes für HelpFileusw.).

HinweisHinweis

Die Basisklasse zu erzwingen, dass eine Funktion wie PrintNameOf zu implementieren ist häufig nicht die beste Entwurf.Virtuelle Funktionen bietet andere Entwurfsalternativen an.

Siehe auch

Referenz

Übersicht über abgeleitete Klassen

Mehrfachvererbung