Единичное наследование
В одном наследовании «,» представление " сводка " наследования классов имеется только один базовый класс.Рассмотрим связь показана на следующей диаграмме.
простая диаграмма Единый-Наследования
Обратите внимание прогрессирование с разделами на определенный момент в элементе управления диаграммы.Другой распространенный атрибут найден в конструкции большинство иерархий класса, производный класс имеет тип связи с базовым классом.в диаграмме, a Book тип - a PrintedDocumentи a PaperbackBook тип - a book.
один другой элемент заметки в диаграмме: Book (и производный класс из PrintedDocumentи базовый класс ()PaperbackBook является производным Book).Скелетное объявление такой иерархии классов показано в следующем примере:
// 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 учетные записи «непосредственно базовым классом для» Book; «косвенный базовый класс для» PaperbackBook.Различие состоит в том, что прямой базовый класс отображается в базовый список объявлений класса и косвенное основание не делает.
Базовый класс, из которого извлекается каждый класс объявлен перед объявлением производного класса.Недостаточно предоставить вперед-снабжая на объявление базового класса. должен быть общим объявлением.
В предыдущем примере описатель доступа Открытый используется.Защищенная значение открытого и закрытого наследование описанных в Управление доступом к членам.
Класс может служить базовый класс для различных конкретных классов, как показано на следующем рисунке.
Пример использования непосредственно ациклической диаграммы
В схеме, указанной выше, вызывается направил ациклическую «диаграмма» (или «группу обеспечения доступности базы данных»), некоторые из классов базовые классы для нескольких производного класса.Однако обратное не имеет значение true. только один прямой базовый класс для каждого производного класса.Фигура в диаграмме показан макет одного «наследование».
Примечание |
---|
Непосредственно ациклические диаграммы не для уникальной идентификации наследование.Они также используются для отображения диаграммы множественн-наследования.В этом разделе покрыта in множественное наследование. |
В наследовании производный класс содержит члены базового класса, и все новые члены добавить.В результате производный класс может относиться к членам базового класса (если эти члены переопределен в производном классе).Оператор разрешения области действия (::) может использоваться для обращения к членам напрямую или косвенных базовых классов, когда эти члены были переопределены в производном классе.Рассмотрим следующий пример.
// 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;
};
Обратите внимание, что конструктор Book(Book::Book), имеющий доступ к элементу данных Name.в программе, объект типа Book может быть создано и используется следующим образом.
// 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();
Как показано в предыдущем примере, член класса и унаследованных данные и функции используются одинаково.Если реализация класса Book вызовы reimplementation PrintNameOf функция функция, которая принадлежит Document класс может быть вызван только с помощью разрешения области действия (::оператор:)
// 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();
}
Указатели и ссылок для производных классов могут быть неявно преобразованы к указателям и ссылки на их базовые классы если доступно только выраженный базовый класс.Следующий Код демонстрирует это понятие, используя указатели (один и тот же принцип применяется к ссылкам):
// 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;
}
В предыдущем примере различные типы создаются.Однако, поскольку все эти типы являются производными от Document класс неявное преобразование в Document *.В результате DocLib разнородный «список» (список, в котором не все объекты имеют один и тот же тип), содержащее различные типы объектов.
Поскольку Document класс имеет a PrintNameOf функция, он может напечатать имя каждой книги в библиотеке, хотя он может исключить некоторые определенные сведения в тип документа (счетчика страниц Bookколичество байтов, HelpFileи т д).
Примечание |
---|
Это базовый класс для реализации функцию как PrintNameOf часто является наиболее эффективный.Виртуальные функции предусмотрены другие возможности конструктора. |