단일 상속

"단일 상속에서"는 일반적인 형태의 상속, 클래스는 하나의 기본 클래스에 있습니다.다음 그림에서 설명 하는 관계를 고려해 야 합니다.

간단한 단일 상속 그래프

단순 Single_Inheritance 그래프

일반에서 진행을 특정 그림에서 note입니다.파생된 클래스에서 발생 하는 대부분의 클래스 계층 구조 디자인에서 발견 한 다른 공통 특성입니다은 "일종의" 관계와 기본 클래스입니다.그림에 Book 는 일종의 PrintedDocument, a PaperbackBook 는 일종의 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.직접 기본 클래스는 클래스 선언 기본 목록에 표시 되 고 간접 기본 있지 않습니다 다릅니다.

각 클래스에서 파생 된 기본 클래스에서는 파생된 클래스의 선언은 하기 전에 선언 되었습니다.기본 클래스에 대 한 정방향 참조 선언을 제공 하는 데 충분 하지 않습니다. 이 완전 한 선언 해야 합니다.

앞의 예제에서 액세스 지정자 public 사용 됩니다.공개, 보호, 및 개인 상속의 의미를 설명 멤버 액세스 제어 합니다.

클래스는 다음 그림에서 볼 수 있듯이 대부분의 특정 클래스에 대 한 기본 클래스로 사용할 수 있습니다.

비순환 그래프의 예제

전달된 비순환 그래프 샘플

위의 다이어그램에서 "전송 된 비순환 그래프" (또는 "DAG") 라는 일부 클래스 파생된 클래스가 두 개 이상에 대 한 기본 클래스입니다.그러나 반대의 true 아닙니다: 어떤 주어진 파생 클래스에 대 한 하나의 직접 기본 클래스가 있습니다.그래프의 그림 "단일 상속" 구조를 보여 줍니다.

[!참고]

비순환 방향된 그래프는 단일 상속에 고유 하지 않습니다.다중 상속 그래프 표현에 사용 됩니다.이 항목에 설명 된 다중 상속.

상속에는 기본 클래스의 멤버와 모든 새 멤버를 추가 하 여 파생 된 클래스를 포함 합니다.따라서 (멤버는 파생된 클래스에서 다시 정의 되지 않는 한) 파생된 클래스는 기본 클래스의 멤버에 참조할 수 있습니다.범위 결정 연산자 (::) 멤버는 파생된 클래스에서 재정의 된 한 때 직접 또는 간접 기본 클래스의 멤버를 참조 하는 데 사용 됩니다.다음 예제를 고려해 보십시오.

// 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 호출의 경우에는 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 클래스는 PrintNameOf 함수를 일부 특정 종류의 문서에 정보를 생략할 수 있지만 라이브러리에서 각 책의 이름을 인쇄할 수 있습니다 (페이지에 대 한 수 Book, 숫자에 대 한 바이트 HelpFile등).

[!참고]

함수를 구현 하는 기본 클래스를 강제로 PrintNameOf 최상의 디자인 경우가 많습니다.가상 함수 다른 디자인 대안을 제공 합니다.

참고 항목

참조

파생된 클래스의 개요

다중 상속