스터디/C++

상속

elenalee 2023. 10. 18. 14:54

1. 기초클래스 파생클래스 

- 기초 클래스 : 공통적인 멤버를 포함하는 유사한 유형의 클래스

- 파생 클래스 : 일반화와 특수화를 통한 클래스 계층구조설계

- 클래스 계층 : 트리구조(1개의 기초부터 상속), 그래프구조 (2개 이상에서 상속)

 

(1) 파생클래스

선언형식 

 

(2) 기초클래스와 파생클래스 ( Person, Student )

Person class

① 사람을 나타내는 클래스, ②이름을 가지고,  ③이름을 지정하거나 알릴수 있음

Student class

① 학생을 나타내는 클래스, ②사람의 이름을 상속,  ③학교 이름을 지정하거나 지정된 학교이름을 알릴수 있음

 

 

(3) 파생클래스의 생성자 및 소멸자

▷ 생성자 선언형식

 

▷ 생성자 및 소멸자의 실행순서

    생성자 : 기초클래스 생성자 → 파생클래스 생성자 (기초클래스의 내용을 바탕으로 함)

    ** 객체의 기초 클래스 내용이 준비된 후 파생클래스에 선언된 내용 초기화 

    소멸자 : 파생클래스 소멸자 → 기초클래스 소멸자 

    ** 기초 클래스 속성이 제거되기 전에 활용할 가능성이 있는 파생클래스 객체를 먼저 제거

 

 

(4) 가시성 

 

▷ 가시성의 적용사례

 

 

(5) 기타 클래스

  final 클래스 : final class로 선언되면 파생 클래스를 정의할 수 없음

    ** final은 키워드 아닌 식별자 (특별히 정해진 위치가 아닌경우 식별자로 사용가능, 비권장)

 

  이름 은폐 (name hiding)

어떠한 영역에 선언된 이름을 그 영역에 내포된 영역에서 다시 선언, 내포된 영역의 바깥 영역의 이름이 은폐됨 

 

2. 포인터

 

(1) 클래스 계층구조와 포인터

- 기초 클래스 포인터(참조)로 가리킬수 있는 대상 (기초 클래스는 파생클래스를 포인터 가능)

 

(2) 객체  포인터 배열 

Person 및 Studen class의 객체를 가리키는 포인터 저장하는 배열 선언, ②배열에 저장된 객체를 출력하는 함수,  ③를 통해 출력하는 프로그램 

 

 

 

(3) 가상함수 

  정적연결 

 

▷  동적연결 

객체 포인터로 멤버함수를 호출, 포인터하는 실제 객체에 따라 실행중에 멤버함수결정

c++에서는 가상함수(virtual function)으로 동적연결을 구현

기초 클래스에서 가상함수로 선언한 멤버함수를 재정의한 파생클래스 함수는 가상함수(동적 연결)

 

 

(4)소멸자의 동적연결 (가상함수) 

▷  소멸자를 가상함수로 선언

- 기초 클래스의 포인터에 연결된 파생클래스 객체를 제거할때 파생클래스의 소멸자가 동작 

- 객체에 적합한 소멸자가 작동 

 

▷  소멸자를 가상함수로 선언하지 않은 경우

- 기초 클래스의 포인터에 연결된 파생클래스 객체 제거시 기초 클래스 소멸자만 동작

    → 파생클래스 소멸자가 동작하지 않아 필요한 작업이 누락

 

(5)업캐스팅과 다운캐스팅 

▷  업캐스팅 : 파생클래스 포인터를 기초클래스 포인터로 변환, 묵시적 형변환을 통해 업캐스팅

▷  다운캐스팅 : 기초클래스 포인터를 파생클래스 포인터로 변환, 묵시적 형변환 불가, 형변환 연산자로 명시적 형변환 필요

 

(6)기타

가상함수 재정의 (override)

- virtual은 파생클래스에서 새롭게 가상함수를 선언하고자 할때만 사용(기초클래스 가상함수 재정의 시 사용할 필요없음)

- 파생 클래스에서는 어떤 함수가 가상함수인지 명확하지 않아, 가상함수 재정의임을 명시적으로 표현할때는 'override'를 지정

 

 가상함수 재정의 금지(final)

 

3. 추상클래스와 다중상속

(1) 추상클래스

- 유사한 성격을 갖는 클래스들의 공통요소를 뽑아만든 클래스

- 일부메서드의 구체적인 구현이 없어 직접적인 사례가 존재하지 않는 클래스 

- 추상클래스로 객체를 직접 정의할수 없음 ( 파생클래스를 통해 구현)

사용목적 : 특정그룹에 속하는 클래스(파생클래스)들이 반드시 가지고 있어야할 행위를 지정(누락방지)

ex) 도형의 draw, move메서드 (도형 자체는 draw, move메서드 정의할 수 없음)

 

추상클래스의 선언 (멤버함수 중 순수가상함수가 포함된 클래스선언)

순수가상함수 : 구현부분이 없는 가상함수

virtual RetType functionName(fParameterList) = 0

 => Aclass objA// Error, 추상클래스객체정의불가

 

(2) 상세클래스

- 클래스의 모든 요소가 구체적으로 구현되어 직접적인 사례가 존재하는 클래스

- 상세 클래스는 객체를 정의할수 있음 

ex) 삼각형, 원 (추상클래스 '도형'에서 상속받은 draw, move도 구체적으로 정의) 

 

 상세클래스의 선언 (순수가상함수가 포함되지 않은 클래스선언)

- 상속받은 순수가상함수가 있다면 반드시 재정의

 

(3) 추상 클래스의 활용 ( 도형클래스 )

도형클래스 

2차원 도형에 해당되는 원의 클래스, 삼각형의 클래스 선언, ②선의 색과 내부의 색 속성을 가지며,  ③이러한 속성을 이용하여 그리는 방법을 설명, 그래프 객체를 (dx, dy)만큼 이동, 2차원 좌표원점을 기준으로 확대/축소하는 크기조정

속성객체

 선의 색과 내부색을 표현, 값을 설정하고 읽어낼수 있으며, 도형객체는 현재 속성에 따라 생성, 선색 혹은 내부색 변경가능 

 

속성 클래스 GAttribute메서드 및 속성 

 

 도형 클래스 Figure의 메서드 및 속성

 

Circle 클래스의 메서드 및 속성

 

Triangle 클래스의 메서드 및 속성

 

추상클래스의 활용 

 

(3) 다중상속 ( 2개 이상의 기초 클래스로부터 상속)

 

여러 클래스에서 상속 (예)학생이면서 직장인인 클래스)

 

 

 파생 클래스내에 같은 이름이 존재할 경우 모호성

- 정확한 클래스를 명시하여 오류 방지

 

▷ 다중상속에서 공통기초클래스의 중복상속 

- 가상 기초 상속클래스로 중복 상속방지

- 다중 상속에서 공통 기초클래스를 한번만 상속(초기화필요)

'스터디 > C++' 카테고리의 다른 글

연산자 다중정의  (0) 2023.10.17
함수와 클래스  (0) 2023.10.12
자료형 및 흐름제어  (2) 2023.10.11