[C++] public 다형 상속

2021. 7. 6. 19:35·C++/Basic
목차
  1. 가상 파괴자
  2. 업캐스팅과 다운캐스팅

파생 클래스에서 기초 클래스의 메서드를 다르게 사용해야 될 때가 있다. 호출하는 객체에 따라 메서드의 행동이 달라질 수도 있는데 이 때 다형상속이 필요하다.

 

다형 상속의 방법

- 기초 클래스 메서드를 파생 클래스에서 다시 정의한다.

- 가상 메서드를 사용한다.

 

class Test
{
	...
	virtual void Print() const;
};

class Test2
{
	...
	virtual void Print() const;
};
Test x(123, "sss");
Test2 y(13, "ss");
Test & t1 = x;
Test & t2 = y;
t1.Print();	//Test::Print()를 사용한다.
t2.Print();	//Test2::Print()를 사용한다.

- virtual 키워드를 사용하면 원래는 참조나 포인터를 사용하여 객체를 지시했을 경우 기초 클래스의 메서드를 선택하지만 가상 메서드는 지시한 객체에 따라 선택이 된다.

- 파생 클래스에서 정의되지 않은 기초 클래스의 메서드는 사용 범위 결정 연산자를 파생 클래스의 메서드에서 사용하지 않아도 된다.

- 메서드를 사용할 때 포인터나 참조를 사용하지 않았다면 자기 자신의 클래스의 메서드를 사용한다.

 

가상 파괴자

- 파괴자가 가상이 아니라면 포인터형에 해당하는 파괴자만 호출될 것이다.

- 파괴자가 가상이면 객체형에 해당하는 파괴자가 호출된다.

- 파생 클래스의 파괴자가 먼저 파괴 후에 기초 클래스를 자동으로 파괴한다.

- 파생 클래스에서 어떤 일을 하는 파괴자를 가지게 된다면 기초 클래스에 파괴자가 가상으로 제공하는 것이 좋다.

Test * xx = new Test2;	//Test 기초클래스, Test2파생 클래스일 때
delete xx;

- Test가 기초 클래스고 가상소멸자를 가졌을 때는 xx는 Test2를 파괴하고 Test를 파괴한다.

- Test가 기초 클래스고 일반소멸자라면 Test만 파괴한다.

 

 

업캐스팅과 다운캐스팅

업캐스팅

파생 클래스의 참조나 포인터를 기초 클래스의 참조나 포인터로 변환하는 것을 업캐스팅이라 한다.

void fr(Brass & rb);
void fp(Brass * pb);
void fv(Brass b);

int main()
{
    Brass b("dd", 123);
    BrassPlus bp("dd", 123);
    fr(b);	//Brass
    fr(bp);	//BrassPlus
    fp(b);	//Brass
    fp(bp);	//BrassPlus
    fv(b);	//Brass
    fv(bp);	//Brass
}

- 위 함수를 통해 가상메서드를 사용할 경우 참조나 포인터를 사용하면 파생 클래스의 메서드를 사용한다. (암시적 업캐스팅)

- 값을 전달하면 파생 클래스를 넣어도 기초 클래스를 사용한다.

 

다운캐스팅

기초 클래스 포인터나 참조를 파생 클래스 포인터나 참조로 변환 하는 것을 다운캐스팅이라 한다.

다운 캐스팅은 명시적인 데이터형 변환 없이는 허용되지 않는다.


기초 클래스에 있는 메서드를 파생 클래스에서 다시 정의할 예정이라면, 그것을 가상함수로 선언해야 한다.

파생 클래스에서 다시 정의할 예정이 아니라면, 그것을 가상이 아닌 함수로 선언해야한다.

 

 

 

 

 

 

 

 

 

도움사이트 : https://scienceofdata.tistory.com/entry/%EA%B0%80%EC%83%81-%ED%8C%8C%EA%B4%B4%EC%9E%90virtual-destructor

 

가상 파괴자(virtual destructor)

기본 클래스를 생성할 때 파괴자를 가상 파괴자로 선언해 두는 습관이 좋다고 합니다. 예제를 통해 그 이유를 살펴봅시다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31..

scienceofdata.tistory.com

 

저작자표시 (새창열림)

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

[C++] 템플릿 클래스  (0) 2021.07.19
[C++] 다중 상속과 가상 기초 클래스  (0) 2021.07.14
[C++] 클래스의 상속  (0) 2021.07.05
[C++] 멤버 초기자 리스트  (0) 2021.07.04
[C++] 대입 생성자  (0) 2021.06.30
  1. 가상 파괴자
  2. 업캐스팅과 다운캐스팅
'C++/Basic' 카테고리의 다른 글
  • [C++] 템플릿 클래스
  • [C++] 다중 상속과 가상 기초 클래스
  • [C++] 클래스의 상속
  • [C++] 멤버 초기자 리스트
chanheess
chanheess
'왜' 그렇게 했는가?에 대한 생각으로 공부 및 작업의 저장관리
  • chanheess
    왜 그렇게 생각했는가?
    chanheess
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Backend Programming
      • Game Programming
        • Unreal
        • DirectX
      • C++
        • Memo
        • Basic
        • Effective Modern
      • Java
      • Algorithm
        • Memo
        • Baekjoon
        • Programmers
        • HackerRank, LeetCode
      • Data Structure
      • Design Pattern
      • Etc
        • Memo
        • Daily Log
        • Book
  • 최근 글

  • 최근 댓글

  • 태그

    알고리즘
    티스토리챌린지
    spring
    오블완
    프로그래머스
    c++ 기초 플러스
    SpringSecurity
    dfs
    dp
    JWT
    위클리 챌린지
    Java
    JPA
    백준
  • hELLO· Designed By정상우.v4.10.0
chanheess
[C++] public 다형 상속

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.