1. 정의
- 객체 단위 코드를 재사용하는 방법이며 기능적 확장이나 개선을 의미
- 두 개 이상의 클래스 사이 관계를 고려해 프로그램 작성
2. 기본 문법
//기본,부모 클래스
class CMyData
{
public:
CMyData() {cout << "CMyData 생성자 호출" << endl;}
int GetData() {return nData;}
void SetData(int nParam) {nData = nParam;}
//파생 클래스만 접근 가능
protected:
void PrintData() {cout << "CMyData 메서드 호출" << 두이;}
// 해당 클래스외 접근 불가능
private:
int nData = 0;
};
//파생,자식 클래스
class CMyDataEx : public CMyData
{
public:
CMyDataEx() {cout << "CMyDataEx 생성자 호출" << endl;}
void TestFunc()
{
//기본 클래스 맴버에 접근
PrintData();
SetData(5);
cout << CMyData::GetData() << endl;
}
};
//사용자 측면
int main()
{
CMyDataEx data;
//기본 클래스 멤버 접근
data.SetData(10);
cout << data.GetData() << endl;
//파생클래스 멤버 접근
data.TestFunc();
return 0;
}
- 파생 클래스의 인스턴스가 생성될 때 기본 클래스의 생성자도 호출
- 파생 클래스는 기본 클래스의 멤버에 접근할 수 있지만 private 멤버는 접근 불가
- 사용자 코드에서는 파생 클래스의 인스턴스를 통해 기본 클래스 메서드 호출할 수 있다.
3. 메서드 재정의
//초기 제작 클래스
class CMyData
{
public:
CMyData() {cout << "CMyData 생성자 호출" << endl;}
int GetData() {return nData;}
void SetData(int nParam) {nData = nParam;}
// 해당 클래스외 접근 불가능
private:
int nData = 0;
};
//후기 제작 클래스
class CMyDataEx : public CMyData
{
public:
CMyDataEx() {cout << "CMyDataEx 생성자 호출" << endl;}
void SetData(int nParam)
{
//기능추가
//재귀호출 방지하기위해 소속 클래스 명시 필요
if(nParam < 0) {CMyData::SetData(0);}
if(nParam > 10) {CMyData::SetData(10);}
}
};
//사용자 측면
int main()
{
//구형은 값 보정 기능x
CMyData a;
a.SetData(-10);
cout << a.GetData() << endl;
//신형에는 값 보정 기능o
CMyDataEx b;
b.SetData(15);
cout << b.GetData() << endl;
return 0;
}