본문 바로가기
C++ 공부

inheritance 01

by Dev_Hugh 2021. 8. 20.
728x90
반응형

Study about inheritance

inheritance

  • 코드를 재사용하는 방법 중 하나 (누군가 작성한 코드를 가져다 사용)
  • 규모 확장 (재사용 과정에서 일어남)
  • 관계의 한 유형 (class간의 관계)
  • 설계 <- 객체(요수) 규정 + 관계 정의
  • 설계에선 UML 이야기 필수
  • C++에선 SOLID 원칙이 있음

상속 예시

// 사람 클래스
class person { };
// 의사 클래스
class doctor : public person { };
// 이때 사람클래스에서 파생된게 의사 클래스
  • 부모는 사람클래스 자식은 의사클래스
  • 부모는 기본클래스 자식은 파생클래스
  • "의사는 사람의 일종" 표현 가능
  • 현재가 의사클래스면 사람클래스는 과거
    이렇게 시점으로도 생각하자

상속 이해 코드

using namespace std;

class CTest
{
public:
    CTest() { cout << "CTest()" << endl;}
    ~CTest() { cout << "~CTest()" << endl; }  
    void TestFunc(void)
    {
        cout << "CTest::TestFunc()" << endl;
    }
};

class CTestEx : public CTest
{
public:
    CTestEx() { cout << "CTestEx()" << endl;}
    ~CTestEx() { cout << "~CTestEx()" << endl; }  

    // 재 정의
    void TestFunc(void)
    {
        cout << "CTestEx::TestFunc()" << endl;
    }
};

int main(void)
{
    // 1번
    CTestEx a_Ex;
    a_Ex.TestFunc();

    // 2번
    CTestEx b;
    CTest &c = b; // 파생형식을 기본형식으로 pointing 중
    c.TestFunc(); // CTest::TestFunc() 호출됨
    return 0;
}

1번 설명

  • 1번 출력시 부모클래스의 생성자도 호출됨 (꼭 직접 확인하자)
  • 즉 a_Ex가 CTestEx() call 하고 여기서 부모클래스 CTest()를 콜 한뒤 부모클래스 생성자가 return하여 CTestEx()를 실행한다
  • 따라서 생성자는 [call순서] 와 [실행순서] 가 일치하지 않음
  • 생성자함수는 only [객체 자신을 초기화] 만 하자
  • 즉 파생형식 생성자에서 부모클래스 멤버 초기화는 최악의 바보짓!!

2번 설명

  • 파생형식 <- 기본형식 이렇게 pointing 가능
  • 즉 파생형식은 기본형식으로 pointing 가능
  • ex) 기본형식이 사람, 파생형식이 학생이면 학생 <- 사람 이게 가능
  • 이때 사람을 추상형식 학생을 구현형식이라고 말할수있음
  • c.TestFunc()는 일반 메서드를 호출함으로 접근형식을 따름
  • 여기서 CTestEx b는 실형식 CTest &c는 접근형식이다

Method 종류에 따른 접근 (매우 중요)

  • 일반 : [접근형식] 을 따름
  • static
  • virtual : [실형식] 을 따름

헷갈리기 쉬운거

class A {}; // 크기 [A크기]
class B : public A {}; // 크기 [[A크기] + [B크기]] = [전체가 B]
  • A의 크기가 [000] 이정도면
  • B의 크기는 [000(A)]+[000(B)] 이걸 합쳐서 B 라고 부른다
  • 만약 B를 A* 접근시 B의 크기에서 앞에 A부분만 접근하는거고 B*로 접근하면 B의 크기 전체를 접근하는거
  • 그런데 B*를 A의 접근하면 A에는 B의 부분이 없으므로 불가
  • 추후 [가상함수] 까지 추가되면 헷갈리니 꼭 기억
728x90
반응형

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

inheritance 03  (0) 2021.08.20
inheritance 02  (0) 2021.08.20
operator 02  (0) 2021.08.20
operator 01  (0) 2021.08.20
constructor 05  (0) 2021.08.20