추천, 2024

에디터의 선택

상속과 다형성의 차이

상속을 허용, 코드 재사용과 다형성, 다른 형태로 하나의 기능이 발생합니다. 상속과 다형성의 기본적인 차이점은 상속을 사용하면 이미 존재하는 코드를 프로그램에서 다시 재사용 할 수 있으며 다형성은 호출 할 함수의 형식을 동적으로 결정하는 메커니즘을 제공한다는 것입니다.

비교 차트

비교의 근거계승다형성
기본상속은 이미 존재하는 클래스의 속성을 사용하여 새 클래스를 만드는 것입니다.다형성은 기본적으로 여러 형식에 대한 공통 인터페이스입니다.
이행상속은 기본적으로 클래스에 구현됩니다.다형성은 기본적으로 함수 / 메소드에서 구현됩니다.
용도OOP에서 재사용의 개념을 지원하고 코드 길이를 줄입니다.컴파일 타임 (오버로딩)과 런타임 (오버라이드)에서 호출 할 함수의 형식을 오브젝트가 결정할 수있게합니다.
양식상속은 단일 상속, 다중 상속, 다중 레벨 상속, 계층 적 상속 및 하이브리드 상속 일 수 있습니다.다형성은 컴파일 타임 다형성 (오버로딩) 또는 런타임 다형성 (오버라이드) 일 수 있습니다.
클래스 '테이블'은 '가구'클래스의 '가구'클래스의 기능을 상속받을 수 있습니다.'study_table'클래스는 'set_color ()'함수를 가질 수 있으며 'Dining_table'클래스는 'set_color ()'함수를 가질 수 있으므로 호출 할 set_color () 함수의 형식을 컴파일 타임과 컴파일 타임에서 모두 결정할 수 있습니다. 실행 시간.

상속의 정의 :

상속은 "재사용 성"을 강력하게 지원하는 OOP의 중요한 기능 중 하나입니다. 재사용은 기존 클래스의 속성을 다시 사용하여 새 클래스를 만드는 것으로 설명 할 수 있습니다. 상속에서는 파생 클래스에 상속되는 기본 클래스가 있습니다. 클래스가 다른 클래스를 상속 받으면 기본 클래스의 멤버가 파생 클래스의 멤버가됩니다.

클래스를 상속하는 일반적인 형식은 다음과 같습니다.

 class derived-class-name : 액세스 지정자 base-class-name {// 클래스의 본문}; 

여기에서 액세스 지정자는 기본 클래스의 멤버에게 파생 클래스에 대한 액세스 모드 (개인, 공개, 보호)를 제공합니다. 액세스 지정자가 없으면 기본적으로 "개인"으로 간주됩니다. C ++에서 파생 클래스가 "struct"이면 액세스 지정자는 기본적으로 "public"입니다.

C ++에서는 상속을 다섯 가지 형식으로 수행 할 수 있습니다. 그들은 다음과 같이 분류 될 수 있습니다 :

  • 단일 상속 (오직 하나의 수퍼 클래스)
  • 다중 상속 (여러 수퍼 클래스)
  • 계층 적 상속 (하나의 수퍼 클래스, 많은 서브 클래스)
  • 다중 상속 (파생 클래스에서 파생 됨)

Java에서 클래스는 키워드 "extends"를 사용하여 다른 클래스를 상속합니다. Java에서 기본 클래스는 수퍼 클래스로, 파생 클래스는 서브 클래스로 참조됩니다. 서브 클래스는 "private"로 선언 된 기본 클래스의 멤버에 액세스 할 수 없습니다. Java에서 클래스를 상속하는 일반적인 형식은 다음과 같습니다.

 class derived-class-name은 base-class-name {// 클래스의 본문}을 확장합니다. 

Java는 다중 상속의 상속을 지원하지 않지만 다중 계층은 지원합니다. 자바에서는 때로는 수퍼 클래스가 구현 세부 사항을 숨기고 그 데이터의 일부를 "비공개"로 만들 수 있습니다. Java에서와 같이 서브 클래스는 수퍼 클래스의 private 멤버에 액세스 할 수 없으며 서브 클래스가 해당 멤버에 액세스하거나 초기화하려고하면 Java가 솔루션을 제공합니다. 서브 클래스는 키워드 "super"를 사용하여 직접적인 수퍼 클래스의 멤버를 참조 할 수 있습니다. 직접 슈퍼 클래스의 멤버 만 액세스 할 수 있습니다.

'슈퍼'는 두 가지 일반적인 형태를 가지고 있습니다. 첫 번째는 수퍼 클래스의 생성자를 호출하는 데 사용됩니다. 두 번째 방법은 하위 클래스의 멤버에 의해 숨겨진 수퍼 클래스 멤버에 액세스하는 것입니다.

 // 생성자를 호출하는 첫 번째 형식. class supper_class {supper_class (argument_list) {..} // 수퍼 클래스의 생성자}; sub_class extends supper_class {sub_class (argument_list) {..} // sub_class의 생성자 super (argument_list); // sub_class는 수퍼 클래스의 생성자를 호출}}; 
 // 초의 'super'클래스 supper_class {int i; } class sub_class extends supper_class {int i; sub_class (int a, int b) {super.i = a; // 슈퍼 클래스의 'i'i = b; // 하위 클래스의 'i'}}; 

다형성의 정의

다형성이라는 용어는 단순히 '하나의 기능, 복수 형태'를 의미합니다. 다형성은 컴파일 타임과 런타임 모두에서 달성됩니다. 컴파일 시간 다형성은 "오버로딩"을 통해 이루어 지지만 실행 시간 다형성은 "오버라이드"를 통해 이루어집니다.

다형성 (polymorphism)은 객체가 컴파일 타임과 런타임 모두에서 "호출 할 함수의 형식"을 결정할 수있게합니다.
오버로드의 첫 번째 개념에 대해 살펴 보겠습니다. 오버로딩에서, 우리는 오버랩 될 함수가 동일한 리턴 타입을 가져야 만하는 반면 클래스에서 다른 데이터 타입과 매개 변수의 수를 가진 함수를 두 번 이상 정의합니다. 대부분 오버로드 된 함수는 클래스의 생성자입니다.

 클래스 오버로드 {int a, b; public : int overload (int x) {// 첫 번째 overload () 생성자 a = x; a를 돌려 보내십시오; } int overload (int x, int y) {// 두 번째 overload () 생성자 a = x; b = y; a * b를 돌려 준다; }}; int main () {오버로드 O1; O1.overload (20); // 첫 번째 overload () 생성자 호출 O1.overload (20, 40); // 두 번째 overload () 생성자 호출} 

이제 두 번째 형태 인 다형성, 즉 재정의 문제에 대해 살펴 보겠습니다. 오버라이드 개념은 상속 개념을 구현하는 클래스의 기능에만 구현 될 수 있습니다. C ++에서 오버라이드 할 함수 앞에는 기본 클래스의 키워드 "virtual"이오고 키워드 "virtual"을 제외하고 동일한 프로토 타입으로 파생 클래스에서 재정의됩니다.

 class base {public : virtual void funct () {// 기본 클래스의 가상 함수 cout << "기본 클래스의 funct ()"; }}; class derived1 : public base {public : void funct () {// 파생 클래스 1에서 재 정의 된 기본 클래스의 가상 함수 cout 

상속과 다형성의 주요 차이점

  1. 상속은 이미 존재하는 클래스에서 해당 기능을 파생시키는 클래스를 만드는 것입니다. 한편, 다형성은 여러 형태로 정의 할 수있는 인터페이스입니다.
  2. 상속은 클래스에서 구현되지만, 다형성은 메소드 / 함수에서 구현됩니다.
  3. 상속으로 인해 파생 클래스는 기본 클래스에 정의 된 요소와 메서드를 사용할 수 있으므로 파생 클래스는 이러한 요소를 정의하거나 다시 메서드를 요구할 필요가 없으므로 코드 재사용 가능성이 높아 지므로 코드 길이가 줄어 듭니다 . 반면 다형성을 사용하면 객체가 컴파일 타임과 런타임 모두에서 호출 할 메소드의 형식을 결정할 수 있습니다.
  4. 상속은 단일 상속, 다중 상속, 다중 레벨 상속, 계층 적 상속 및 하이브리드 상속으로 분류 할 수 있습니다. 한편, 다형성은 오버로딩 및 오버라이드로 분류됩니다.

결론:

상속과 다형성은 상속 개념을 구현하는 클래스에 동적 다형성이 적용되므로 상호 관련된 개념입니다.

Top