상속
부모 클래스를 물려받아 자식클래스가 그대로 사용할 수 있는 것
이미 정의된 클래스를 상속받아 사용 할 수 있는 장점
부모가 되는 클래스 : 기반 클래스, 기초 클래스, 베이스 클래스
자식 클래스 : 파생 클래스
접근 지정자 | 자신의 클래스 | 파생 클래스 | 클래스 외부 |
private | O | X | X |
protected | O | O | X |
public | O | O | O |
파생 클래스 사용 방법
class 파생 클래스 : 접근 지정자 기반 클래스{
멤버변수:
멤버함수:
};
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 | #include<iostream> using namespace std; class Calc { protected: int a, b, c; public: void Init(int new_a, int new_b); void Prn(); }; void Calc::Init(int new_a, int new_b) { a = new_a; b = new_b; c = 0; } void Calc::Prn() { cout << "a : "<< a << "\tb : " << b << "\tc : " << c << endl; } class Add : public Calc { public: void Sum(); }; void Add::Sum() { c = a + b; } class Mul : public Calc { public: void Gob(); }; void Mul::Gob() { c = a*b; } void main() { Add x; Mul y; x.Init(3, 5); y.Init(2, 7); x.Sum(); x.Prn(); y.Gob(); y.Prn(); } | cs |
▲부모 클래스와 파생 클래스 생성 예제
상속관계에서의 생성자와 소멸자
생성자와 소멸자는 맴버함수지만 상속이 불가능
파생 객체가 생성시 부모 클래스의 생성자 까지 연속적으로 자동 호출됨
즉, 위 예제의 Add 클래스를 생성할때 Calc 생성자도 호출되며 메모리 공간엔 Calc+Add 만큼 공간을 차지하게 됨
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 | #include<iostream> using namespace std; class Base { public: Base(); ~Base(); }; Base::Base() { cout << "부모 클래스의 생성자 호출" << endl; } Base::~Base() { cout << "부모 클래스의 소멸자 호출" << endl; } class Dervied : public Base{ public: Dervied(); ~Dervied(); }; Dervied::Dervied() { cout << "파생 클래스의 생성자 호출" << endl; } Dervied::~Dervied() { cout << "파생 클래스의 생성자 호출" << endl; } void main() { Dervied obj; } | cs |
▲상속관계에서의 생성자와 소멸자
부모 클래스의 생성자가 인자값이 필요한 경우 다음과 같이 전달할 수 있다.
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 | #include<iostream> using namespace std; class Calc { protected: int a, b, c; public: Calc(); Calc(int new_a, int new_b); void Prn(); }; void Calc::Prn() { cout << "a : "<< a << "\tb : " << b << "\tc : " << c << endl; } Calc::Calc() { a = 0; b = 0; c = 0; } Calc::Calc(int new_a, int new_b) : a(new_a), b(new_b), c(0) { } class Add : public Calc { public: void Sum(); Add(int new_a, int new_b); Add(); }; void Add::Sum() { c = a + b; } Add::Add(int new_a, int new_b) : Calc(new_a, new_b) { } Add::Add() : Calc() { } void main() { Calc x(3, 5); x.Prn(); Add y(3, 5); y.Prn(); Add z; z.Prn(); } | cs |
▲상속 관계에서 생성자 문제 해결하기
오버라이딩
이미 정의된 함수를 파생클래스에서 다시 정의하는 것(재정의)
부모 클래스에서 정의된 함수의 원형과 동일한 형태여야 함
오버로딩 : 같은 함수이름을 매개변수와 반환타입을 다르게하여 여러개 정의하는 것
오버라이딩 : 상속받은 함수를 재정의 하는 것
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 | #include<iostream> using namespace std; class Calc { protected: int a, b; public: Calc(); Calc(int new_a, int new_b); void Prn(); }; void Calc::Prn() { cout << "a : "<< a << "\tb : " << b << endl; } Calc::Calc() : a(0),b(0) { } Calc::Calc(int new_a, int new_b) : a(new_a), b(new_b) { } class Add : public Calc { protected: int c; public: Add(int new_a, int new_b); Add(); void Sum(); void Prn(); }; void Add::Sum() { c = a + b; } Add::Add(int new_a, int new_b) : Calc(new_a, new_b) ,c(0) { } Add::Add() : Calc(), c(0) { } void Add::Prn() { cout << a << " + " << b << " = " << c << endl; } class Mul : public Calc { protected: int c; public: Mul(int new_a, int new_b); Mul(); void Gob(); void Prn(); }; void Mul::Gob() { c = a * b; } Mul::Mul(int new_a, int new_b) : Calc(new_a, new_b), c(0) { } Mul::Mul() : Calc(), c(0) { } void Mul::Prn() { cout << a << " * " << b << " = " << c << endl; } void main() { Calc x(3, 5); x.Prn(); Add y(3, 5); y.Sum(); y.Prn(); Mul z(3, 5); z.Gob(); z.Prn(); } | cs |
▲오버라이딩 예제
'프로그래밍 > C++' 카테고리의 다른 글
(C++) Simple 한/영사전 예제 (0) | 2016.07.09 |
---|---|
(C++) 상속을 이용한 간단한 계산 클래스 구현 (0) | 2016.07.09 |
(C++) 연산자 오버로딩 (0) | 2016.07.09 |
(C++) 클래스 객체 (0) | 2016.07.09 |
(C++, MFC) 영상처리 16*16블록으로 DCT(discrete cosine transform)&역DCT (0) | 2016.07.09 |