본문 바로가기
C/C++

C++ (13주) [상속 2 , 가상 함수]

by DeathStar183 2022. 10. 19.

저번주에 보고 간 내용

 

● 기본 클래스와 상속 클래스

● 상속접근제어

● protected멤버

● 상속에서 생성자와 소멸자

● 계층적 다중 상속

● 여러개의 기본 클래스 상속

 

이번주에 보고 갈 내용

 

● 상속 심화

● 바인딩

● 오버로딩과 오버리딩

● 정적 멤버변수

● 가상 함수 ( virtual function static ) , 순수 가상함수

 

 

 

13-1. 기본적인 2개 기본 클래스 상속 1

 

 

 

13-2. 기본적인 2개 기본 클래스 상속 2

 

 

 

13-3. 여러개의 기본 클래스를 상속받을때, 생성자와 소멸자의 실행 순서

 

 

 

앞의 4번과 5번은 쓸데없이 복잡하므로 무리하게 이해하려 하지 않는것을 추천합니다.

체감상 기말고사때 이 두개와 관련된 문제가 거의 하나씩은 나옵니다. (경험자로써)

물론 똑같이 나온다는건 아니고, 이거와 비슷하게는 거의 나온다고 보면 됩니다.

 

 

 

13-4. 이름과 전화번호 관리 (기본클래스 name , 파생 클래스 phone)

 

 

 

13-5. 비행기의 대한 정보를 저장하는 계층적 클래스

● 기본 클래스 Airship  운반할 수 있는 여행객의 수와 짐을 저장

● Airship으로부터 파생된 클래스 Airplane  엔진의 종류(프로펠러 또는 제트)와 운항 거리 저장

● Airship으로부터 파생된 클래스 Balloon 기구를 들어올리는데 사용되는 가스의 종류(수소 또는 헬륨)와 최대 고도 저장

 

 

 

 

 

가상함수(virtual function)의 필요성

클래스를 상속 받아서 쓰는데, 상속 받은 클래스의 함수 중 고치고 싶은 함수가 있을 때

기존 클래스의 모든 내용을 모두 현재 프로그램에 사용할 수 있는데, 특정 함수가 마음에 들지 않음

기존의 클래스를 고치느니 상속을 받고, 가상함수를 이용하여 기존의 함수를 고쳐서 사용

● 상속 받은 함수(부모)를 실행하지 않고 자신(자식)의 함수를 실행

가상함수의 구현을 중복(overriding)이라고 함

 

 

 

오버라이딩, 가상 함수 구현

가상함수는 기본(부모) 클래스 내에서 정의된 멤버함수를 파생(자식) 클래스에서 재정의하고자

   할 때 사용한다.

 

기본 클래스의 멤버함수와 같은 이름의 함수를 파생 클래스에서 재정의하여 사용한다.

 

파생 클래스 내에서 가상함수의 재정의는 함수 중첩 기능과 비슷하지만 파생 클래스에서 재정의되는 가상함수는 기본 클래스와 함수의 리턴값, 매개변수 개수, 형이 완전히 같아야 한다.

 

 

 

바인딩 (binding)

변수와 함수에 대한 메모리 할당이나 함수 호출이 발생했을 때 실제로 처리해야 하는

   명령어들이 결정되는 시점

 

● 정적(static) 바인딩, early

   → 컴파일시 변수의 위치와 함수가 실행할 명령이 결정되는 경우

   static 변수, overloading

 

● 동적(dynamic) 바인딩, late

   → 실제 실행할 때(run time) 결정되는 경우

   → 지역 변수, overriding

 

 

 

13-6. 동적 바인딩(지역 변수)과 정직 바인딩(static 변수)

 

 

 

13-7. 정적 (static) 멤버변수와 특징

● 클래스의 멤버 변수 선언문에 static이라는 키워드 붙임

● 객체들이 정보를 공유할 목적으로 사용하는 변수

● C언어의 static변수와 의미가 다름

 

 모든 객체가 공유하는 멤버변수

 한 클래스로부터 객체가 여러 개 만들어지더라도 이 멤버변수는 하나만 생성됨

 여러 객체들에서 공유해야 하는 정보는 정적 멤버변수로 선언

 

 

 

13-8. 정적 (static) 멤버변수

 

• 마우스가 눌린 좌표를 저장하는 Point클래스 구현

 

• 마우스를 누를 때 마다 좌표 값을 저장하기 위해 객체 생성

 

• 눌린 좌표 값 저장하기 위해 멤버변수

x, y선언

 

• 눌린 횟수를 저장하는 정적 멤버변수     count 선언

 

• 클래스 선언이 기억 장소를

  할당하는 것이 아니므로 정적

  멤버변수는클래스 밖에서 초기화를 함

(정의함, 초기화 값이 없으면 0으로 초기화 됨)

 

• 실행시(동적 바인딩) p1, p2, p3 객체가 만들어지면서 각각의 x와 y가 스택에 할당

• 컴파일시(static 바인딩) count의 값이 하나 만들어짐

 

 

 

가상함수 (virtual function)

● 오버라이딩을 구현하는 방법

● 동적(실행시) 바인딩, late binding

 가상함수를 정의하기 위해서는 기본 클래스의 멤버함수 앞에 'virtual'이라는 키워드를 씀

 

● 가상함수는 하나의 이름(인터페이스)으로 여러 개의 수단과 방법을 제공하는 객체지향 프로그래밍의 다형성을

   구현하는 한 방법

 

● 기본 클래스에서 상속 받았는데 파생 클래스에서 멤버함수를 재정의하는 이유는 어떠한 경우라도 기본클래스의

   멤버함수를 버리고 파생 클래스의 멤버함수를 사용하려는 것

 

● 기존 클래스의 모든 내용을 모두 현재 프로그램에 사용할 수 있는데 특정 함수가 걸맞지 않을 경우, 기존의 클래스를

   고치느니 상속을 받고 가상함수를 이용하여 마음에 들지 않는 함수만 고쳐서 사용함

 

 

 

가상함수 형식

 

 

 

13-9. static binding (overloading)

 

 

 

13-10. dynamic binding (overriding)

 

 

 

13-11. 순수 가상 함수

● 순수가상함수는 파생클래스에서 반드시 재정의 해야 함

● 순수가상함수를 갖는 클래스를 추상클래스라 함

● 추상클래스는 객체를 생성할 수 없음

 

● 부모 클래스의 포인터는 이 클래스로부터 파생된 어떤 자식 객체도 가리킬 수 있다.

● 가상 함수를 호출할 때 기본 클래스의 포인터 p가 가리키는 객체의 클래스에 따라 자동적으로 해당 클래스에

   소속된 멤버 함수를 호출한다.

 

 

 

13-12. virtual 있을때와 없을때 차이

 

 

해당 내용은 인덕대학교 2021년도 2학기 C프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.

강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.

 

댓글