types inheritance c
예제를 통해 C ++의 모든 상속 유형을 살펴보십시오.
이전 자습서에서 C ++의 상속에 대해 배웠습니다. 클래스가 파생되는 방식이나 클래스가 상속하는 기본 클래스 수에 따라 다음과 같은 상속 유형이 있습니다.
- 단일 상속
- 다중 상속
- 다단계 상속
- 계층 적 상속
- 하이브리드 상속
=> 전체 C ++ 자습서 목록을 탐색하려면 여기를 참조하십시오.
학습 내용 :
상속 유형
다음은 다양한 유형의 상속을 그림으로 표현한 것입니다.
아래 섹션에서 예제와 함께 각 상속 유형을 살펴 보겠습니다.
# 1) 단일 상속
단일 상속에서 클래스는 하나의 기본 클래스에서만 파생됩니다. 이것은 하나의 수퍼 클래스에서 파생 된 서브 클래스가 하나뿐임을 의미합니다.
단일 상속은 일반적으로 다음과 같이 선언됩니다.
class subclassname : accessspecifier superclassname { //class specific code; };
다음은 단일 상속의 완전한 예입니다.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; int main() { Dog dog; cout<<'Dog has '< 산출:
개는 다리가 4 개 있습니다.
개는 꼬리가 1 개 있습니다.
개 짖는 소리 !!!
하위 클래스 dog를 파생시킨 기본 클래스로 Animal 클래스가 있습니다. dog 클래스는 Animal 클래스의 모든 멤버를 상속하며 출력에서 볼 수 있듯이 자체 속성을 포함하도록 확장 할 수 있습니다.
단일 상속은 가장 간단한 상속 형태입니다.
# 2) 다중 상속
다중 상속은 아래 그림으로 표현됩니다.
다중 상속은 클래스가 둘 이상의 클래스에서 파생되는 상속 유형입니다. 위의 다이어그램에서 볼 수 있듯이 클래스 C는 클래스 A와 클래스 B를 부모로 갖는 하위 클래스입니다.
실제 시나리오에서 아이는 아버지와 어머니로부터 물려받습니다. 이것은 다중 상속의 예로 고려할 수 있습니다.
다중 상속을 입증하기 위해 아래 프로그램을 제시합니다.
#include using namespace std; //multiple inheritance example class student_marks { protected: int rollNo, marks1, marks2; public: void get() { cout <> rollNo; cout <> marks1 >> marks2; } }; class cocurricular_marks { protected: int comarks; public: void getsm() { cout <> comarks; } }; //Result is a combination of subject_marks and cocurricular activities marks class Result : public student_marks, public cocurricular_marks { int total_marks, avg_marks; public: void display() { total_marks = (marks1 + marks2 + comarks); avg_marks = total_marks / 3; cout << '
Roll No: ' << rollNo << '
Total marks: ' << total_marks; cout << '
Average marks: ' << avg_marks; } }; int main() { Result res; res.get(); //read subject marks res.getsm(); //read cocurricular activities marks res.display(); //display the total marks and average marks }
산출:
롤 번호 입력 : 25
가장 높은 점수 2 개 입력 : 40 50
CoCurricular 활동 : 30
롤 번호 : 25
총 점수 : 120 점
평균 점수 : 40
위의 예에는 student_marks, cocurricular_marks 및 Result의 세 가지 클래스가 있습니다. student_marks 클래스는 학생의 주제 표시를 읽습니다. cocurricular_marks 클래스는 과외 활동에서 학생의 점수를 읽습니다.
Result 클래스는 평균 점수와 함께 학생의 total_marks를 계산합니다.
이 모델에서 Result 클래스는 과외 활동 점수뿐만 아니라 주제의 결과를 계산하기 때문에 student_marks 및 cocurricular_marks에서 파생됩니다.
이것은 여러 상속을 나타냅니다.
다이아몬드 문제
다이아몬드 문제는 아래 그림으로 표현됩니다.
자바에서 정수 목록을 만드는 방법
여기에는 아버지와 어머니의 두 클래스를 상속하는 자식 클래스가 있습니다. 이 두 클래스는 차례로 Person 클래스를 상속합니다.
그림에서 볼 수 있듯이 Child 클래스는 Person 클래스의 특성을 두 번, 즉 아버지로부터 한 번, 어머니로부터 두 번 상속합니다. 이것은 컴파일러가 어느 방향으로 가야할지 이해하지 못하기 때문에 모호성을 유발합니다.
이 시나리오는 다이아몬드 모양의 상속이있을 때 발생하기 때문에이 문제를 ' 다이아몬드 문제 ”.
C ++로 구현 된 Diamond 문제로 인해 컴파일시 모호성 오류가 발생합니다. 루트 기본 클래스를 가상 클래스로 만들어이 문제를 해결할 수 있습니다. 다형성에 대한 다음 자습서에서 '가상'키워드에 대해 자세히 알아볼 것입니다.
# 3) 다단계 상속
다단계 상속은 다음과 같습니다.
다중 수준 상속에서 클래스는 다른 파생 클래스에서 파생됩니다. 이 상속은 구현이 진행되지 않는 한 여러 수준을 가질 수 있습니다. 위의 다이어그램에서 클래스 C는 클래스 B에서 파생되고 클래스 B는 차례로 클래스 A에서 파생됩니다.
다단계 상속의 예를 살펴 보겠습니다.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; class Puppy:public Dog{ public: void weeping() { cout<<'Weeps!!'; } }; int main() { Puppy puppy; cout<<'Puppy has '< 산출:
강아지의 다리는 4 개입니다.
강아지는 꼬리가 1 개 있습니다.
강아지 짖는 소리 !!! 강아지가 울다 !!
여기에서는 Dog 클래스에서 상속되는 새 클래스 Puppy가 있고 다시 Animal 클래스에서 상속되는 단일 상속의 예제를 수정했습니다. Puppy 클래스가 그 위에있는 두 클래스의 속성과 메서드를 획득하고 사용하는 것을 볼 수 있습니다.
# 4) 하이브리드 상속
하이브리드 상속은 아래에 설명되어 있습니다.
하이브리드 상속은 일반적으로 둘 이상의 상속 유형의 조합입니다. 위의 표현에서 하이브리드 상속을 얻기 위해 다중 상속 (B, C 및 D) 및 다중 수준 상속 (A, B 및 D)이 있습니다.
하이브리드 상속의 예를 살펴 보겠습니다.
#include #include using namespace std; //Hybrid inheritance = multilevel + multilpe class student{ //First base Class int id; string name; public: void getstudent(){ cout <> id >> name; } }; class marks: public student{ //derived from student protected: int marks_math,marks_phy,marks_chem; public: void getmarks(){ cout <>marks_math>>marks_phy>>marks_chem; } }; class sports{ protected: int spmarks; public: void getsports(){ cout <> spmarks; } }; class result : public marks, public sports{//Derived class by multiple inheritance// int total_marks; float avg_marks; public : void display(){ total_marks=marks_math+marks_phy+marks_chem; avg_marks=total_marks/3.0; cout << 'Total marks =' << total_marks << endl; cout << 'Average marks =' << avg_marks << endl; cout << 'Average + Sports marks =' << avg_marks+spmarks; } }; int main(){ result res;//object// res.getstudent(); res.getmarks(); res.getsports(); res.display(); return 0; }
산출:
학생 ID 및 학생 이름 입력 25 Ved
3 개의 제목 표시 입력 : 89 88 87
스포츠 마크 입력 : 40
총 점수 = 264
평균 점수 = 88
평균 + 스포츠 점수 = 128
여기에는 Student, Marks, Sports 및 Result의 네 가지 클래스가 있습니다. 마크는 학생 클래스에서 파생됩니다. Result 클래스는 스포츠 마크뿐만 아니라 주제 마크에서 결과를 계산하므로 마크 및 스포츠에서 파생됩니다.
출력은 세 클래스 모두의 속성을 획득 한 Result 클래스의 객체를 생성하여 생성됩니다.
하이브리드 상속에서도 구현시 앞서 언급 한 '가상'키워드를 사용하여 해결할 수있는 '다이아몬드 문제'가 발생할 수 있습니다.
# 5) 계층 적 상속
계층 적 상속에서 둘 이상의 클래스는 위의 표현에 표시된 것처럼 단일 기본 클래스에서 상속됩니다. 이것은 계층 구조의 구조를 제공합니다.
다음은 계층 적 상속을 보여주는 예제입니다.
#include using namespace std; //hierarchical inheritance example class Shape // shape class -> base class { public: int x,y; void get_data(int n,int m) { x= n; y = m; } }; class Rectangle : public Shape // inherit Shape class { public: int area_rect() { int area = x*y; return area; } }; class Triangle : public Shape // inherit Shape class { public: int triangle_area() { float area = 0.5*x*y; return area; } }; class Square : public Shape // inherit Shape class { public: int square_area() { float area = 4*x; return area; } }; int main() { Rectangle r; Triangle t; Square s; int length,breadth,base,height,side; //area of a Rectangle std::cout <>length>>breadth; r.get_data(length,breadth); int rect_area = r.area_rect(); std::cout << 'Area of the rectangle = ' <base>>height; t.get_data(base,height); float tri_area = t.triangle_area(); std::cout <<'Area of the triangle = ' << tri_area<side; s.get_data(side,side); int sq_area = s.square_area(); std::cout <<'Area of the square = ' << sq_area< 산출:
직사각형의 길이와 너비 입력 : 10 5
직사각형의 면적 = 50
삼각형의 밑면과 높이 입력 : 4 8
삼각형의 면적 = 16
정사각형의 한쪽 길이 입력 : 5
사각형의 면적 = 20
위의 예는 Shape 클래스의 고전적인 예입니다. 기본 클래스 Shape가 있고 세 개의 클래스 즉, 직사각형, 삼각형 및 정사각형이 파생됩니다.
Shape 클래스의 데이터를 읽는 방법이 있으며 각 파생 클래스에는 면적을 계산하는 자체 방법이 있습니다. 주 함수에서는 각 개체에 대한 데이터를 읽고 면적을 계산합니다.
결론
다른 프로그래밍 언어와 비교할 때 C ++ 언어는 모든 유형의 상속을 지원합니다. 사실, 우리는 C ++이 상속을 매우 잘 지원한다고 말할 수 있습니다. C ++를 사용하여 실시간 문제를보다 효과적으로 모델링 할 수 있습니다.
이 자습서에서는 C ++에서 지원하는 모든 유형의 상속을 살펴 보았습니다.
또한 읽기 = >> Java의 상속 유형
다가오는 튜토리얼에서는 OOP의 다형성 기능에 대해 자세히 알아볼 것입니다.
=> 여기에서 전체 C ++ 무료 교육 시리즈를 확인하십시오.
추천 도서