사용(Use 관계)
클래스의 멤버 함수가 다른 클래스의 멤버 함수를 호출함
포함(has-a 관계)
클래스의 멤버 변수로 다른 클래스를 사용함 예) Automobile has-a Engine.
상속(is-a 관계)
다른 클래스의 멤버변수와 멤버함수를 물려받아 사용함
※ 기존 클래스를 활용하여 새로운 클래스가 파생되므로 클래스의 재사용과 신뢰도 향상의 효과가 있음
예) Bus is-a Automobile.
클래스의 상속(Inheritance)이란 ?
기존 클래스 멤버를 물려받고, 필요한 멤버를 추가하여 새 로운 클래스를 정의함
예)
클래스명 : Animal 멤버변수 : sp_code
origin_cd name
멤버함수 : void Cry()
클래스명 : Dog 멤버변수 : color
멤버함수 : void Run()
클래스명 : Bird 멤버변수 : wing
멤버함수 : void Fly()
Parent class(부모) Super class(슈퍼) Base class(베이스)
Child class(자식) Sub class(서브)
Derived class(파생)
클래스 상속
부모클래스의 멤버변수와 멤버함수를 자식클래스가 상속 받아 사용할 수 있음
※ 부모클래스의 전용멤버(private member)는 접근 불가 형식) class 자식클래스명 : 접근권한 부모클래스명{
멤버 정의 }; :
접근 지정자 protected(보호)
- 부모클래스의 보호멤버는 자식클래스가 상속받아 사용
할 수 있으나 외부에서는 접근 불가함, 즉 부모클래스의 공
용멤버와 보호멤버가 상속됨
// 클래스 상속 프로그램
#include <iostream>
#include <string>
using namespace std;
class Animal{
protected:
int sp_code;
int origin_cd;
string name;
public:
Animal(){ };
string get_name(){
return name;};
void Cry(){
cout << "울음" << endl;
return; };
};
class Dog : public Animal{
int color;
public:
Dog(int, int, string, int);
void Run(){ };
};Dog::Dog(int s, int o, string n, int c){
sp_code = s; origin_cd = o;
name = n; color= c;
}int main( )
{ Dog a(10, 20, "발발이", 5);
a.Cry();
cout << a.get_name() << endl;
return 0;
}
자식 클래스의 생성 과정
- 부모클래스의 생성자가 실행되고, 자식클래스의 생성자 가 실행됨
- 부모클래스의 생성자는 기본 생성자가 실행되며, 매개변 수 있는 생성자를 실행하려면 생성자 멤버 초기화 리스트를 사용함 ※ 소멸자는 자식클래스, 부모클래스 순으로 실행됨
예) Animal::Animal(int s, int o, string n): sp_code(s), origin_cd(o), name(n){ };
Dog::Dog(int s, int o, string n, int c) : Animal(s, o, n),
color(c){ }
// 상속 생성자 프로그램
#include <iostream>
#include <string>
using namespace std;
class Animal{
int sp_code;
int origin_cd;
string name;
public:
Animal(int s, int o, string n):
sp_code(s), origin_cd(o), name(n) { };
string get_name(){
return name;};
void Cry(){
cout << "울음" << endl;
return; };
};
class Dog : public Animal{
int color;
public:
Dog(int, int, string, int);
void Run(){ };
};Dog::Dog(int s, int o, string n, int c):
Animal(s, o, n){
color= c;
}int main( )
{ Dog a(10, 20, "발발이", 5);
a.Cry();
cout << a.get_name() << endl;
return 0;
}
멤버함수 재정의(Overriding)
- 부모클래스로부터 상속받은 멤버함수의 변경이 필요한 경우에 재정의할 수 있고, 멤버함수의 헤더는 동일하고, 함수 몸체만 수정함
- 함수가 재정의되면 재정의된 함수가 우선적으로 호출됨
※ 부모클래스의 함수를 호출하려면 범위지정자(::)를 사용 하여 명시함
※ 함수 중복(Overloading)과 재정의(Overriding)
※ 멤버변수 재정의
- 부모클래스의 멤버변수와 동일한 멤버변수를 자식클래 스에 정의할 수 있음
- 가급적 사용하지 않는 것이 좋음
// 상속 멤버 재정의 프로그램
#include <iostream>
#include <string>
using namespace std;
class Animal{
protected:
int sp_code;
int origin_cd;
string name;
public:
Animal(){ };
string get_name(){
return name;};
void Cry(){
cout << "울음" << endl;
return; };
};
class Dog : public Animal{
int color;
public:
Dog(int, int, string, int);
void Cry(){
cout << "멍멍" << endl;
return; };
};※ Dog 생성자 생략함 int main( )
{ Dog a(10, 20, "발발이", 5);
a.Cry();
a.Animal::Cry();
cout << a.get_name() << endl;
return 0;
}