Automotive Software

상속 (Inheritance) 본문

프로그래밍 (Programming)/C++ (C Plus Plus) 기초

상속 (Inheritance)

AutoSW 2021. 1. 2. 02:16
  • 상속 (Inheritance) : 기존 클래스의 속성을 새로운 클래스 기본 속성으로 사용하는 것
  • 파생 (Derivation) : 상속된 속성에 새로운 속성을 추가하여 클래스를 생성하는 것
// class 클래스_명 : 파생형 베이스_클래스_명
e.g) class myClass : public myBaseClass

 

  • 접근 명시자 (Access specifier)
    • public : 멤버 함수와 변수를 클래스 외부에서 접근 가능
    • private : 멤버함수와 변수를 클래스 외부에서 접근 불가능
    • protected : 멤버함수와 변수를 클래스 외부에서 접근 불가능하나 파생된 클래스에서는 가능
  • 생성자와 소멸자 실행 순서
    • 베이스 클래스 생성자 -> 신규 클래스 생성자 -> 신규 클래스 소멸자 -> 베이스 클래스 소멸자
  • 상속 시 베이스 클래스에 초기화 값 전달
class cMyBaseClass
{
public:
	cMyBaseClass();
	cMyBaseClass(int initVal);
	~cMyBaseClass();
...
private:
	int baseMemVar;
};

class cMyClass : public cMyBaseClass
{
public:
	cMyClass();
	cMyClass(int initBaseMemVal, int initMemVal);
	~cMyClass();
...
private:
	int memVar;
};

// 베이스 생성자에게 초기화 값 전달하는 법
cMyClass::cMyClass():
cMyBaseClass(),
memVar(0)
{
}

cMyClass::cMyClass(int initBaseMemVal, int initMemVal):
cMyBaseClass(initBaseMemVal),
memVar(initMemVal)
{
}

 

  • 함수 재생(Overriding) 과 중첩(Overloading)
구분 반환값 함수명 매개변수 목록 함수내 구현
함수 중첩(Overloading) 상이 동일 상이 상이
함수 재생(Overriding) 동일 동일 동일 상이
  • 함수 중첩 시 유의 사항
    • 오직 반환값만 상이한 중첩은 허용되지 않음
  • 함수 재생 시 유의 사항
    • 베이스 클래스에 다수의 중첩 함수들이 파생 함수 내 하나의 재생 함수에 은폐(hiding)되어 사용 불가
    • 베이스 클래스내 함수의 직접적인 호출
// 베이스_클래스_명::함수_명()
cMyBaseClass::memFunc(0);

 

  • 가상 함수(Virtual Method)
    • 베이스 클래스의 특정 함수를 파생 클래스에서 정의한 다양한 함수로 동적으로 변경하여 사용할 수 있도록 선언하는 함수
    • 가상 함수가 있으면 반드시 소멸자도 가상 함수로 구현
    • 오직 참조자와 포인터를 이용하여 사용 가능
    • 파생 클래스에서는 가상 함수 키워드를 사용하지 않아도 되나 가독성을 위해 사용하는 것을 추천
class cMyBaseClass
{
public:
	cMyBaseClass(){}
	virtual ~cMyBaseClass(){}
	virtual void baseMemFunc(){ cout<<"func() from my base class"; }
};

class cMyClass:cMyBaseClass
{
public:
	virtual void baseMemFunc() { cout<<"func() from my class"; }
};