dev_eun

[C++] ⑥ 상속 기본 본문

공부/C++

[C++] ⑥ 상속 기본

_eun 2020. 10. 14. 19:04

[Chapter 6] 상속 기본

용어

상속 : 객체 단위 코드를 재사용하는 방법
재정의 : 기존의 선언 및 정의된 코드를 유지하면서 새롭게 바꾸는 방법
메소드 재정의 : 클래스에 있는 메소드를 자유롭게 재정의


상속

객체 단위 코드를 재사용하는 방법
상속 받는 클래스와 상속하는 클래스 사이의 관계를 고려해 프로그램 작성

기본 형식

class 파생클래스이름 : 접근제어지시자 부모클래스이름

public 접근 제어 지시자를 통한 상속

  • 파생 클래스 인스턴스가 생성되면 기본 클래스의 생성자 호출
  • 파생 클래스는 private 접근 제어 지시자로 선언된 멤버를 제외한 기본 클래스의 멤버에 접근 가능
    식별자 검새 순서에 근거
  • 사용자 코드에서 파생 클래스의 인스턴스를 통해 기본 클래스 메소드 호출 가능

메소드 재정의(Override)

기존 클래스의 메소드와 새로 정의된 메소드가 공존하며 새 메소드가 기존 메소드를 대체
(X) 기존 코드 제거
(O) 기존 메소드와 새 메소드 한데 묶어 작동

기본 문법

class CMyData{
    public:
    void SetData(int nParam){ mData = nParam; }
    ...
};

class CMyDataEx : public CMyData{
    public:
    // 함수 재정의
    void SetData(int nParam){
        if(nParam < 0) CMyData::SetData(0);
        if(nParam > 10) CMyData::SetData(10);
        // **주의** 재귀호출 당연하쥬?
        // SetData(0);
    }
};

부모 클래스 멤버 메소드 명시적 호출

CMyDataEx b;
b.SetData(15);              // CMyDataEx::SetData() 함수 호출
b.CMyData::SetData(15);    // CMyData::SetData() 함수 호출

참조 형식과 실형식

포인터도 가능

int main(){
    CMyDataEx a;
    CMyData& rData = a;
    rData.SetDat(15);   // CMyData::SetData() 함수 호출
    cout<< rData.GetData() << '\n';
}

생성자와 소멸자

실행 순서

Class A { };
Class B : public A { };
Class C : public B { };
C c;

생성자

호출 순서 : C -> B -> A
실행 순서 : A -> B -> C
호출과 실행 순서가 역순
자식 클래스에서 생성자를 실행하기 전 부모 클래스의 생성자 호출

소멸자

호출 순서 : C -> B -> A
실행 순서 : C -> B -> A
호출과 실행 순서가 동일
자식 클래스의 소멸자에서 리턴하기 전 부모 클래스의 소멸자 호출

생성자와 소멸자는 객체 자신의 초기화 및 해제

  • 파생 클래스는 부모 클래스의 멤버 변수에 직접 쓰기 연산하지 않아야 함
  • 파생 클래스 생성자에서 부모 클래스 멤버 변수를 초기화하지 않아야 함

    생성자 선택

    이니셜라이저를 통해 상위 클래스 생성자를 호출하듯이 기술하는 것
    부모 클래스와 자식 클래스에서 생성자가 다중 정의되어 있을 경우 생성자 선택 가능
    class CMyData{
      public:
      CMyData() { ... }
      CMyData(int nParam) { ... }
      CMyData(double dParam) { ... }
    }
    

class CMyDataEx: public CMyData{
public:
CMyDataEx() { }
CMyDataEx(int nParam) : CMyData(nParam) { ... }
DMyDataEx(int dParam) : DMyData(dParam) { ... }
}

#### 생성자 상속
부모 클래스의 생성자를 그대로 자식 클래스로 가져올 때 사용   
```c++
class CMyDataEx : public CMyData{
    public:
    using CMyData::CMyData;
}

연습 문제

Q1
기본 형식
Q2
A

728x90

'공부 > C++' 카테고리의 다른 글

[C++] ⑧ 수평적 관계와 집합 관계  (0) 2020.12.10
[C++] ⑦ 상속 심화  (0) 2020.12.10
[C++] ⑤ 연산자 다중 정의  (0) 2020.10.14
[C++] ④ 복사 생성자와 임시 객체  (0) 2020.10.14
[C++] ③ 클래스  (0) 2020.10.14