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을 상속받는다. 
};

 

 

 

상속의 목적 및 장점

  1. 간결한 클래스 작성
    • 기본 클래스의 기능을 물려받아 파생 클래스를 간결하게 작성
  2. 클래스의 계층적 분류 및 관리의 용이함
    • 상속은 클래스들의 구조적 관계 파악 용이
  3. 클래스 재사용과 확장을 통한 소프트웨어 생산성 향상
    • 빠른 소프트웨어 생산 필요
    • 기존에 작성한 클래스의 재사용 - 상속
      • 상속받아 새로운 기능을 확장
    • 앞으로 있을 상속에 대비한 클래스의 객체 지향적 설계 필요

 

업 캐스팅(up-casting)

  • 파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것

 

다운 캐스팅(down-casting)

  • 기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것

 

 

 

protected 접근 지정

 

접근 지정자

  • private 멤버
    • 선언된 클래스 내에서만 접근 가능
    • 파생 클래스에서도 기본 클래스의 private 멤버 직접 접근 불가
  • public 멤버
    • 선언된 클래스나 외부 어떤 클래스, 모든 외부 함수에 접근 허용
    • 파생 클래스에서 기본 클래스의 public 멤버 접근 가능
  • protected 멤버
    • 선언된 클래스에서 접근 가능
    • 파생 클래스에서만 접근 허용
      • 파생 클래스가 아닌 다른 클래스나 외부 함수에서는 protected 멤버를 접근할 수 없다.

 

 

ex1) 파생 클래스의 객체가 생성될 때 파생 클래스의 생성자와 기본 클래스의 생성자 모두 실행된다.

ex2) 파생 클래스의 생성자와 기본 클래스의 생성자 중 기본 클래스가 먼저 실행된 후 파생 클래스의 생성자가 실행된다.

 

 

소멸자의 실행 순서

  1. 파생 클래스의 소멸자가 먼저 실행
  2. 기본 클래스의 소멸자가 나중에 실행

 

 

생성자 소멸자 순서

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;
}

[그림1] 생성자 소멸자 순서

 

 

# 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;
}




[그림2] color 클래스 상속

 

 

상속 시 접근 지정에 따른 멤버의 접근 지정 속성 변화

# 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();
}




[그림3] 접근 방식에 따른

 

 

가상 상속

  • 다중 상속으로 인한 기본 클래스 멤버의 중복 상속 해결
  • 가상 상속
    • 파생 클래스의 선언문에서 기본 클래스 앞에 virtual로 선언
    • 파생 클래스의 객페가 생성될 때 기본 클래스의 멤버는 오직 한 번만 생성

 

 

 

 

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기