Part03 객체지향의 전개

PassionYim·2023년 12월 11일
0

C++

목록 보기
4/4
post-thumbnail

상속(Inheritance)

: 한 클래스의 멤버 변수와 함수를 가져온다

용어의 정리

상속의 형태

  • public 상속
  • protected 상속
  • private 상속

상속의 관계

  • A is a B
  • A has a B

상속 예제

객체 포인터의 참조관계

객체 포인터 변수 : 객체의 주소 값을 저장하는 포인터 변수

Person * ptr;		//포인터 변수 선언
ptr = new Person();		//포인터 변수의 객체 참조

위 코드가 실행되면, 포인터 ptr은 Person 객체를 가리키게 된다.
하지만, Person형 포인터는 Person객체 뿐만 아니라,
Person을 상속하는 유도 클래스의 객체도 가리킬 수 있다.

Code 33, 34 줄을 봤을 때, Person포인터 변수는 Person객체와
Person을 직접 or 간접적으로 상속하는 모든 객체를 가리킬 수 있다.

함수 오버라이딩(Function Overriding)

Person, Student, Part-Time Student
모든 함수가 상속관계에 있지만, Show()함수와 Show_state()함수가 각 각의 이름과 형태가 같은 함수로 선언이 가능.

※ 함수 오버로딩 => 함수 명이 같고, 매개변수가 다른 경우

가상함수(Virtual Function)

: 자료형을 기준이 아닌, 선언된 객체 기준으로 함수가 호출.

※ 가상함수가 적용되지 않았을 때

ptr1의 객체는 Student이다.
하지만, Student의 멤버 함수 ShowStudent() 호출 시 Error가 발생함.
이는 포인터 자료형이 Person으로 선언되어 있기 때문에, Person의 Show()함수는호출이 가능하다.

“C++ 컴파일러는 포인터 연산의 가능성 여부를 판단 할 떄, 포인터의 자료형을 기준으로 판단하지, 실제 가리키는 객체의 자료형을 기준으로 판단하지 않는다.”

※ 가상함수가 적용됐을 때

"Virtual 키워드의 선언으로 선언된 Student 객체를 기준으로, 함수가 실행됨."

순수 가상함수(Pure Virtual Function)와 추상 클래스(Abstract Class)

순수 가상함수 : 클래스 중에서 객체생성을 목적으로 정의되지 않는 클래스 => 함수의 몸체가 정의되지 않는 함수

추상 클래스 : 하나 이상의 멤버함수를 순수 가상함수로 선언한 클래스

순수 가상함수화 하지 않을 경우, 객체생성이 목적이 아닌 클래스가 선언이 가능하다. => 개발자 오류..?

Virtual void Show() const = 0;

위 처럼. 함수 옆에 "=0" 선언으로 순수 가상함수화.

Walk* wptr = new Walk();

으로 선언 시 컴파일 에러가 발생한다.

가상 소멸자(Virtual Destructor)와 참조자의 참조 가능성

가상 소멸자 : 객체 소멸과정에서 delete연산자에 사용된 포인터 변수의 자료형에 상관없이 모든 소멸자가 호출되도록 함.

멤버함수와 가상함수의 동작원리

1. 멤버함수 동작원리

2. 가상함수 동작원리

객체지향언어가 c언어보다 느린 이유

: 가상함수가 포함되면, v-table이 생성되고, 테이블을 참조할 함수가 결정되므로 실행속도가 감소한다.

다중상속(Multiple Inheritance)에 대한 이해

기본예제

가상 상속(Multiple Virtual Inheritance)

: 하단 클래스의 상속이 중복으로 선언되는 모호한 상황을 해결하기 위한 방법

profile
열정이 전부였던 개발자

0개의 댓글