Aracılığıyla paylaş


Tek miras

"Tek kalıtım," devralma, ortak bir form, tek bir temel sınıf sınıfları içerir.Aşağıdaki çizimde gösterildiği ilişkisi göz önünde bulundurun.

Basit tek miras grafik

Basit Single_Inheritance grafiği

Genel gelen ilerleme şekildeki belirli unutmayın.Türetilmiş bir sınıf olduğunu çoğu sınıf hiyerarşilerindeki tasarımında bulunan başka bir ortak özniteliği, bir "tür" temel sınıf ile ilişkisi.Şekil içinde bir Book bir tür, bir PrintedDocumentve bir PaperbackBook bir tür, bir book.

Bir öğe şekildeki Not: Book hem türetilmiş bir sınıf olan (dan PrintedDocument) ve bir temel sınıf (PaperbackBook türetilir Book).Böyle bir sınıf hiyerarşisi iskelet bildirimi aşağıdaki örnekte gösterilmiştir:

// 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"doğrudan base" sınıfına kabul Book; bir "dolaylı temel" sınıf olan PaperbackBook.Doğrudan bir temel sınıf temel sınıf bildirimi listesinde görünür ve dolaylı bir Bankası yok fark vardır.

Her sınıfın türetildiği temel sınıf türetilmiş bir sınıf bildiriminden önce bildirildi.Bir temel sınıf için İleri başvuran bir bildirim sağlamak için yeterli değildir; Bu bir tamamlandı bildirimi olmalıdır.

Önceki örnekte, erişim belirticisi ortak kullanılır.Public, protected ve private devralma anlamını açıklanan üye erişim denetimi.

Bir sınıf, birçok özel sınıfları için taban sınıf olarak aşağıdaki şekilde gösterildiği gibi görebilir.

Yönlendirilmiş Acyclic grafik örneği

Yönlendirilmiş Çevrimsiz Grafik örneği

Yukarıdaki şemada, "yönlendirilmiş acyclic grafik" (veya "dag") olarak adlandırılan sınıflarının birden fazla türetilmiş bir sınıf için temel sınıflar bazılarıdır.Ancak, bunun tersi doğru değildir: herhangi verilen türetilmiş sınıf için yalnızca bir doğrudan temel sınıfı vardır."Tek miras" yapısını Şekil grafikte gösterilmektedir.

[!NOT]

Yönlendirilmiş acyclic grafikler tek miras benzersiz değildir.Birden çok devralma grafik görünümünde sığdırabilecek için de kullanılır.Bu konu kapsamında Birden çok devralma.

Kalıtım, türetilmiş bir sınıf temel sınıf üyesi eklediğiniz tüm yeni üyeler içerir.Sonuç olarak, (Bu üyeler türetilmiş bir sınıf içerisinde tanımlanır sürece) türetilmiş bir sınıf temel sınıf üyesi için başvurabilir.Kapsam çözünürlük operatörü (::) üyeleri türetilmiş bir sınıf içerisinde yeniden, doğrudan veya dolaylı temel sınıflar, üyelerine başvurmak için kullanılabilir.Bu örneði ele alalým:

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

Unutmayın kurucusu Book, (Book::Book), veri üyesi erişimi Name.Bir programda türünde bir nesne Book oluşturulan ve aşağıdaki gibi kullanılır:

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

Önceki örnekte gösterdiği gibi sınıf üyesi ve devralınan veriler ve işlevler özdeş olarak kullanılır.Uygulama sınıfı için Book çağırır bir reimplementation için PrintNameOf işlevi, ait olduğu işlev Document sınıf kapsamı çözümlemesi kullanarak adı verilen (::) operatörü:

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

Erişilebilir, belirli bir temel sınıf ise işaretçiler ve türetilmiş sınıflar başvuru örtülü olarak işaretçiler ve bunların temel sınıflar başvuru dönüştürülebilir.Aşağıdaki kod, (aynı ilkeye başvurular için geçerlidir) işaretçiler kullanarak bu kavramı gösteriyor:

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

Yukarıdaki örnekte, farklı türleri oluşturulur.Ancak, bu tür tüm, türetilmiştir çünkü Document sınıfı, bir kapalı dönüştürme Document *.Sonuç olarak, DocLib "heterojen listesi" (hangi değil tüm nesneler aynı türden olan bir liste) farklı türde nesneleri içeren.

Çünkü Document sınıfı olan bir PrintNameOf işlevi, bazı belge türü için belirli bilgileri atlamak ancak Kitaplığı'nda her kitabın adını yazdırabilirsiniz (sayfa sayısı için Book, için bayt sayısı HelpFile, vb.).

[!NOT]

Gibi bir işlevi uygulamak için temel sınıf zorlama PrintNameOf genellikle en iyi tasarım değil.Sanal işlevler diğer tasarım seçenekleri sunar.

Ayrıca bkz.

Başvuru

Türetilmiş sınıfları'na genel bakış

Birden çok devralma