CPP 04
생성일: 2022년 12월 3일 오후 11:02
최종 편집 일시: 2022년 12월 10일 오후 12:08
태그: cpp
cpp notion
CPP MODULE 04
- Subtype polymorphism, abstract classes, interfaces
- 서브타입 다형성(오버라이딩), 추상 클래스, 인터페이스
ex00 Polymorphism
다형성 !
- 다형성이란
- 프로그램 언어의 다형성은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들이 다양한 자료형에 속하는 것이 허가되는 성질을 가리킨다.
- 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미
- 서브타입 다형성 = 오버라이딩
- 상속받는 클래스의 함수를 다르게 동작하도록 재정의, 오버라이딩 하는 것.
- 가상 함수
virtual void makeSound( void ) const;
- C++에서 가상 함수(virtual function)는 파생 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미한다.
이러한 가상 함수는 자신을 호출하는 객체의 동적 타입에 따라 실제 호출할 함수가 결정됩니다.
- 포인터의 타입(클래스)이 아닌 포인터가 가리키는 객체의 타입에 따라 멤버함수를 선택하게 된다. https://dbstndi6316.tistory.com/298
- 동적 바인딩
- c++에서 가상함수가 아닌 멤버 함수는 모두 정적바인딩(컴파일 타임에 고정된 메모리주소로 변환)
- 동적바인딩을 통해 객체의 타입에 따라 멤버함수를 선택
- 가상함수테이블
- http://www.tcpschool.com/cpp/cpp_polymorphism_virtual
- 가상소멸자
- 클래스를 동적할당 하고 해제할 때, 부모의 소멸자가 가상소멸자가 아닐 경우 실제 객체의 클래스가 아닌, 생성된 포인터의 자료형의 소멸자가 호출된다.
ex01 I don’t want to set the world on fire
포인터 멤버 변수와 얕은 복사, 깊은 복사.
- 포인터 멤버 변수
- 생성자에 new 할당
- 소멸자에 delete
- 클래스가 포인터 멤버 변수를 가지고 있을 때 주의 할 점은 객체를 복사할 때 깊은 복사를 해야한다는 것이다.
- 깊은 복사
- 포인터 주소를 복사하는 것이 아닌, 포인터 주소안의 값을 복사를 하는 것
- 앝은 복사
- 포인터 주소를 복사.
- 두개의 객체가 같은 주소를 갖고 있게되어 각각의 소멸자를 불러와 같은 주소에 두번 delete가 실행된다.
ex02 Abstract class
추상클래스, 순수 가상 함수
- 추상 클래스
- 순수 가상 함수가 한개라도 있으면 추상클래스가 된다.
- 순수 가상 함수
- 기초클래스에서 선언만되고 정의되지 않는다.
- 파생클래스에서 오버로딩, 정의 되어야한다.
virtual void makeSound( void ) const = 0;
- 순수 가상 함수가 있기 때문에 추상 클래스 자체로 객체를 만드는 것은 불가능하다.
- 상세 클래스
- 상속받는 순수클래스의 모든 가상 함수를 정의한 클래스.
ex03 Interface & recap
인터페이스
- 인터페이스
- 가상 소멸자와 순수 가상함수만 포함하고 있는 클래스