상속

정재민·2021년 4월 28일
0

C/C++

목록 보기
5/5

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;
}
profile
화이팅

0개의 댓글