728x90
반응형
C++에서의 상속이란?
- 클래스 사이에서 상속관계 정의
- 객체 사이에는 상속 관계 없음
- 기본 클래스의 속성과 기능을 파생 클래스에 물려주는 것
- 기본 클래스(base class) - 상속해주는 클래스, 부모 클래스
- 파생 클래스(derived class) - 상속받는 클래스, 자식 클래스
- 기본 클래스의 속성과 기능을 물려받고 자신 만의 속성과 기능을 추가해 작성
- 기본 클래스에서 파생 클래스로 갈수록 클래스의 개념이 구체화
- 다중 상속을 통한 클래스의 재활용성 높임
class Phone{
void call():
void receive();
};
class MobilePhone : public Phone{
void connectWireless();
void recharge(); // Phone을 상속 받는다.
};
class MusicPhone :public MobilePhone{
void downloadMusic();
void play();
// MobilePhone을 상속받는다.
};
상속의 목적 및 장점
- 간결한 클래스 작성
- 기본 클래스의 기능을 물려받아 파생 클래스를 간결하게 작성
- 클래스의 계층적 분류 및 관리의 용이함
- 상속은 클래스들의 구조적 관계 파악 용이
- 클래스 재사용과 확장을 통한 소프트웨어 생산성 향상
- 빠른 소프트웨어 생산 필요
- 기존에 작성한 클래스의 재사용 - 상속
- 상속받아 새로운 기능을 확장
- 앞으로 있을 상속에 대비한 클래스의 객체 지향적 설계 필요
업 캐스팅(up-casting)
- 파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것
다운 캐스팅(down-casting)
- 기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것
protected 접근 지정
접근 지정자
- private 멤버
- 선언된 클래스 내에서만 접근 가능
- 파생 클래스에서도 기본 클래스의 private 멤버 직접 접근 불가
- public 멤버
- 선언된 클래스나 외부 어떤 클래스, 모든 외부 함수에 접근 허용
- 파생 클래스에서 기본 클래스의 public 멤버 접근 가능
- protected 멤버
- 선언된 클래스에서 접근 가능
- 파생 클래스에서만 접근 허용
- 파생 클래스가 아닌 다른 클래스나 외부 함수에서는 protected 멤버를 접근할 수 없다.
ex1) 파생 클래스의 객체가 생성될 때 파생 클래스의 생성자와 기본 클래스의 생성자 모두 실행된다.
ex2) 파생 클래스의 생성자와 기본 클래스의 생성자 중 기본 클래스가 먼저 실행된 후 파생 클래스의 생성자가 실행된다.
소멸자의 실행 순서
- 파생 클래스의 소멸자가 먼저 실행
- 기본 클래스의 소멸자가 나중에 실행
생성자 소멸자 순서
class Data{
private : int a;
public:
Data(){cout << "Data" << endl;} // 제일 먼저 생성됨
~Data(){cout << "Data" << endl;} // Test가 소멸되고 이후에 소멸
int getA(){
return a;
}
};
class Test : public Data{
public:
Test(){cout << "Test" << endl; // Data 생성자 이후 생성
}
~Test(){cout << "Test" << endl; // Test가 먼저 소멸된다.
}
};
int main()
{
Test t;
return 0;
}
# include <iostream>
# include <string>
using namespace std;
class TV{
protected : int size; // protected: int size; - 함수 사용 안해도 가능 getsize x - size
public:
TV(){
}
~TV(){
}
TV(int size){
this -> size=size;
}
int getSize()
{
return size;
}
};
class ColorTv:public TV{
protected : string color;
public:
ColorTv(){
}
~ColorTv(){}
ColorTv(int size, string color):TV(size)
{
this -> color=color;
}
void show()
{
cout << "크기는" <<getSize() <<" 인치. 색은" << color << endl;
}
};
class QLEDTV:public ColorTv{
int money;
public:
QLEDTV(){
}
~QLEDTV(){
cout << "QLEDTV 소멸자" << endl;
}
QLEDTV(string color, int size, int money):ColorTv(size, color)
{
this -> money = money;
}
void play()
{
cout << "색 : " << color << ", 인치 : " << size << ", 가격 : " << money << endl;
}
};
class SmartTV:public ColorTv{
string ip;
public:
SmartTV(){
}
~SmartTV(){
cout << "smartTV 소멸자 " << endl;
}
SmartTV(int size, string color, string ip):ColorTv(size, color)
{
this -> ip = ip;
}
void display()
{
cout << "인치 : " << size << ", 색 : " << color << ", IP : " << ip << endl;
}
};
int main()
{
ColorTv t(40,"녹색");
t.show();
QLEDTV qtv("Red",60, 56000000);
qtv.play(); // 색은 Red, 크기는 60인치, 가격은 56000000
SmartTV stv(50, "blue", "192.23.5.9");
stv.display(); // blue 색, 50인치, IPAddress 는 192.23.5.9
return 0;
}
상속 시 접근 지정에 따른 멤버의 접근 지정 속성 변화
# include <iostream>
# include <string>
using namespace std;
class Base{
protected : int a;
public:
Base(){
}
Base(int a){
this -> a = a;
}
~Base(){
}
int showA(){
return a;
}
};
class Derived:private Base{
int b;
public:
Derived(){
}
Derived(int a, int b): Base(a){
this -> b = b;
}
~Derived(){
}
void showB(){
cout<<"a : " << showA() << ",b = " << b<< ","<<a<<endl;
}
};
int main(){
Derived x(3,5); //a=3, b=5
x.showB();
}
가상 상속
- 다중 상속으로 인한 기본 클래스 멤버의 중복 상속 해결
- 가상 상속
- 파생 클래스의 선언문에서 기본 클래스 앞에 virtual로 선언
- 파생 클래스의 객페가 생성될 때 기본 클래스의 멤버는 오직 한 번만 생성
728x90
반응형
최근댓글