클래스 상속 관계
클래스 관계
1. has ~a : 클래스의 내용을 가져다 쓴다
- data와 관리 class
- 포함 object
- 제일 많이 쓰는 방식
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include "stdafx.h" #include <stdio.h> #include <string> #include <iostream> using namespace std; //has ~a 관계 class A { string name; public : A() { //디폴트 생성자 cout << "A 생성자" << endl; } A(string name) { //Class B에서 받은 name this->name = name; } void setName(string name) { this->name = name; } string getName() const { return name; } }; class B { A aa; //포함 object int age; public : B() { cout << "B 생성자" << endl; } B(string name, int age) : aa(name) { //aa 객체에 name을 준다 this->age = age; } void setAge(int age) { this->age = age; } int getAge() const { return age; } //A를 가져다 쓰기 void setName(string name) { aa.setName(name); } string getName() const { return aa.getName(); } }; void main() { B bb; B bb("Superman", 10); bb.setName("a"); //이름입력 //bb.aa.setName("a"); //오류 - name이 private으로 되어있기 때문 bb.setAge(10); //나이입력 cout << bb.getName() << endl; //이름출력 cout << bb.getAge() << endl; //나이출력 } | cs |
Has ~a 관계 성적 처리
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include "stdafx.h" #include <string> #include <iostream> using namespace std; //Has ~a 관계 성적 처리 class Name { string name; public : void setName(string name) { this->name = name; } string getName() { return name; } }; class Subject { int score; public : void setScore(int score) { this->score = score; } int getScore() { return score; } }; class ScoMag { //계산 Name n; Subject kor; Subject eng; Subject math; int total; float avg; public : void setName(string name) { n.setName(name); } string getName() { return n.getName(); } void setKor(int score) { kor.setScore(score); } int getKor() { return kor.getScore(); } void setEng(int score) { eng.setScore(score); } int getEng() { return eng.getScore(); } void setMath(int score) { math.setScore(score); } int getMath() { return math.getScore(); } void setTotal(int total) { this->total = total; } int getTotal() { total = kor.getScore() + eng.getScore() + math.getScore(); return total; } void setAvg(float avg) { this->avg = avg; } float getAvg() { avg = getTotal() / 3.f; return avg; } }; void main() { int num = 0; int pos = 0; string name = NULL; int kor = 0, eng = 0, math = 0; cout << "사람 수 : "; cin >> num; ScoMag *sms = new ScoMag[num]; for (int i = 0; i < num; i++) { cout << "이름 : "; cin >> name; sms[i].setName(name); cout << "국어 : "; cin >> kor; sms[i].setKor(kor); cout << "영어 : "; cin >> eng; sms[i].setEng(eng); cout << "수학 : "; cin >> math; sms[i].setMath(math); pos++; } for (int i = 0; i < pos; i++) { cout << "이름 : " << sms[i].getName() << endl; cout << "국어 : " << sms[i].getKor() << endl; cout << "영어 : " << sms[i].getEng() << endl; cout << "수학 : " << sms[i].getMath() << endl; cout << "총점 : " << sms[i].getTotal() << endl; cout << "평균 : " << sms[i].getAvg() << endl; } cout << endl; delete[] sms; } | cs |
2. is ~a : ~는 ~이다
- 상속 : 부모 클래스로부터 물려받음으로써 코드의 확장성과 재사용성을 높힌다
기본 형태
//클래스 B가 A를 상속 받을 때
class A { class B : 접근 지정자 A {
}; };
상속 방식
1. public 상속 //is ~a
- class B : public A { }
- JAVA에서의 상속
- 원래 의미 그대로 상속받음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include "stdafx.h" #include <iostream> using namespace std; class A { int a1; //1 protected : int b1; //2 public : int c1; //3 void setA1(int a1) { this->a1 = a1; } void setB1(int b1) { this->b1 = b1; } int getA1() { return a1; } int getB1() { return b1; } }; class B : public A { int a2; //4 protected: int b2; //5 public: int c2; //6 void setA2(int a2) { this->a2 = a2; } void setB2(int b2) { this->b2 = b2; } int getA2() { return a2; } int getB2() { return b2; } }; class C : public B { int a3; //7 protected: int b3; //8 public: int c3; //9 void setA3(int a3) { this->a3 = a3; } void setB3(int b3) { this->b3 = b3; } int getA3() { return a3; } int getB3() { return b3; } }; void main() { C cc; //a1~c3 //직접 접근가능 -> 직접 표현 cc.c1 = 3; cc.c2 = 6; cc.c3 = 9; cout << "직접 접근 : " << cc.c1 << " " << cc.c2 << " " << cc.c3 << endl; //접근 불가능 -> 함수 표현 cc.setA1(1); cc.setA2(4); cc.setA3(7); cc.setB1(2); cc.setB2(5); cc.setB3(8); cout << "함수 표현해서 접근 : " << cc.getA1() << " " << cc.getA2() << " " << cc.getA3() << endl; cout << "함수 표현해서 접근 : " << cc.getB1() << " " << cc.getB2() << " " << cc.getB3() << endl; } | cs |
2. protected 상속 //has ~a
- class B : protected A { }
- 부모의 접근 지정자가 바뀜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include "stdafx.h" #include <iostream> using namespace std; class A { int a1; //1 protected: int b1; //2 public: int c1; //3 void setA1(int a1) { this->a1 = a1; } void setB1(int b1) { this->b1 = b1; } void setC1(int c1) { this->c1 = c1; } int getA1() { return a1; } int getB1() { return b1; } int getC1() { return c1; } }; class B : protected A { int a2; //4 protected: int b2; //5 public: int c2; //6 void setA2(int a2) { this->a2 = a2; } void setB2(int b2) { this->b2 = b2; } void setC2(int c2) { this->c2 = c2; } int getA2() { return a2; } int getB2() { return b2; } int getC2() { return c2; } }; class C : protected B { int a3; //7 protected: int b3; //8 public: int c3; //9 void setA3(int a3) { this->a3 = a3; } void setB3(int b3) { this->b3 = b3; } int getA3() { return a3; } int getB3() { return b3; } void setA1(int a1) { A::setA1(a1); } int getA1() { return A::getA1(); } void setA2(int a2) { B::setA2(a2); } int getA2() { return B::getA2(); } void setB1(int b1) { A::setB1(b1); } int getB1() { return A::getB1(); } void setB2(int b2) { B::setB2(b2); } int getB2() { return B::getB2(); } void setC1(int c1) { A::setC1(c1); } int getC1() { return A::getC1(); } void setC2(int c2) { B::setC2(c2); } int getC2() { return B::getC2(); } }; void main() { C cc; //직접 접근 가능 cc.c3 = 9; cout << "직접 접근 : " << cc.c3 << endl; //직접 접근 불가능 cc.setA1(1); cc.setA2(4); cc.setA3(7); cc.setB1(2); cc.setB2(5); cc.setB3(8); cc.setC1(3); cc.setC2(6); cout << "함수 표현해서 접근 : " << cc.getA1() << " " << cc.getA2() << " " << cc.getA3() << endl; cout << "함수 표현해서 접근 : " << cc.getB1() << " " << cc.getB2() << " " << cc.getB3() << endl; cout << "함수 표현해서 접근 : " << cc.getC1() << " " << cc.getC2() << endl; } | cs |
3. private 상속 //has ~a
- class B : private A { }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include "stdafx.h" #include <iostream> using namespace std; class A { int a1; //1 protected: int b1; //2 public: int c1; //3 void setA1(int a1) { this->a1 = a1; } void setB1(int b1) { this->b1 = b1; } void setC1(int c1) { this->c1 = c1; } int getA1() { return a1; } int getB1() { return b1; } int getC1() { return c1; } }; class B : private A { int a2; //4 protected: int b2; //5 public: int c2; //6 void setA2(int a2) { this->a2 = a2; } void setB2(int b2) { this->b2 = b2; } void setC2(int c2) { this->c2 = c2; } int getA2() { return a2; } int getB2() { return b2; } int getC2() { return c2; } void setA1(int a1) { A::setA1(a1); } void setB1(int b1) { A::setB1(b1); } void setC1(int c1) { A::setC1(c1); } int getA1() { return A::getA1(); } int getB1() { return A::getB1(); } int getC1() { return A::getC1(); } }; class C : private B { int a3; //7 protected: int b3; //8 public: int c3; //9 void setA3(int a3) { this->a3 = a3; } void setB3(int b3) { this->b3 = b3; } int getA3() { return a3; } int getB3() { return b3; } void setA1(int a1) { B::setA1(a1); } int getA1() { return B::getA1(); } void setA2(int a2) { B::setA2(a2); } int getA2() { return B::getA2(); } void setB1(int b1) { B::setB1(b1); } int getB1() { return B::getB1(); } void setB2(int b2) { B::setB2(b2); } int getB2() { return B::getB2(); } void setC1(int c1) { B::setC1(c1); } int getC1() { return B::getC1(); } void setC2(int c2) { B::setC2(c2); } int getC2() { return B::getC2(); } }; void main() { C cc; //직접 접근 가능 cc.c3 = 9; cout << "직접 접근 : " << cc.c3 << endl; //직접 접근 불가능 cc.setA1(1); cc.setA2(4); cc.setA3(7); cc.setB1(2); cc.setB2(5); cc.setB3(8); cc.setC1(3); cc.setC2(6); cout << "함수 표현해서 접근 : " << cc.getA1() << " " << cc.getA2() << " " << cc.getA3() << endl; cout << "함수 표현해서 접근 : " << cc.getB1() << " " << cc.getB2() << " " << cc.getB3() << endl; cout << "함수 표현해서 접근 : " << cc.getC1() << " " << cc.getC2() << endl; } | cs |
상속 |
부모 |
자식 |
private |
1.private 2.protected 3.pulbic |
모두 private |
protected |
1.private 2.protected 3.public |
1->private 2->protected 3->protected |
public |
1.private 2.protected 3.public |
그대로 상속 |
'Programming > C&C++' 카테고리의 다른 글
[C++] TEMPLATE (6) | 2018.04.15 |
---|---|
[C++] STACK / QUEUE (3) | 2018.04.15 |
[C++] POINTER ARRAY (0) | 2018.04.15 |
[C++] DYNAMIC MEMORY (1) | 2018.04.15 |
[C++] 오버로딩이 불가능 연산자 (2) | 2018.04.15 |