윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 08. 상속과 다형성
윤성우의 열혈 C++ 프로그래밍 Chapter 08-1. 객체 포인터의 참조관계 윤성우 저 열혈강의 C++ 프로그래밍 개정판
객체의 주소 값을 저장하는 객체 포인터 변수 윤성우의 열혈 C++ 프로그래밍 Person * ptr=new Student(); “ C++에서, AAA형 포인터 변수는 AAA 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다(객체의 주소 값을 저장할 수 있다).” Person * ptr=new Student(); Person * ptr=new PartTimeStudent(); Student * ptr=new PartTimeStudent();
유도 클래스의 객체도 가리키는 포인터! 윤성우의 열혈 C++ 프로그래밍 IS-A 관계 유도 클래스 객체를 기초 클래스 객체로 바라볼 수 있는 근거
오렌지미디어 급여관리 확장성 문제 1차 해결 윤성우의 열혈 C++ 프로그래밍 모든 클래스의 객체를 Employee 클래스의 객체로 간주(처리)할 수 있는 기반을 마련. 컨트롤 클래스 입장에서는 모든 객체를 Employee 객체로 간주해도 문제가 되지 않는다!
EmployeeHandler의 첫 번째 수정 윤성우의 열혈 C++ 프로그래밍 class EmployeeHandler { private: Employee* empList[50]; int empNum; public: EmployeeHandler() : empNum(0) { } void AddEmployee(Employee* emp) empList[empNum++]=emp; } void ShowAllSalaryInfo() const /* for(int i=0; i<empNum; i++) empList[i]->ShowSalaryInfo(); */ void ShowTotalSalary() const int sum=0; /* for(int i=0; i<empNum; i++) sum+=empList[i]->GetPay(); */ cout<<"salary sum: "<<sum<<endl; ~EmployeeHandler() for(int i=0; i<empNum; i++) delete empList[i]; }; 왼쪽의 EmployeeHandler 클래스는 Employee 객체를 처리하는 컨트롤 클래스로 변경되었다.
임시직: TemporaryWorker 윤성우의 열혈 C++ 프로그래밍
영업직: SalesWorker 윤성우의 열혈 C++ 프로그래밍 PermanentWorker 클래스의 GetPay 함수를 오버라이딩! PermanentWorker 클래스의 ShowSalaryInfo 함수 오버라이딩!
Chapter 08-2. 가상함수(Virtual Function) 윤성우의 열혈 C++ 프로그래밍 Chapter 08-2. 가상함수(Virtual Function) 윤성우 저 열혈강의 C++ 프로그래밍 개정판
기초 클래스의 포인터로 객체를 참조하면, 윤성우의 열혈 C++ 프로그래밍
앞서 한 이야기의 복습 윤성우의 열혈 C++ 프로그래밍 예제 EmployeeManager2.cpp와 EmployeeManager3.cpp의 주석처리 부분에서 컴파일 에러가 발생하는 이유는?
함수의 오버라이딩과 포인터 형 윤성우의 열혈 C++ 프로그래밍 실행결과 함수를 호출할 때 사용이 된 포인터의 형에 따라서 호출되는 함수가 결정된다! 포인터의 형에 정의된 함수가 호출된다.
가상함수(Virtual Function) 윤성우의 열혈 C++ 프로그래밍 오버라이딩 된 함수가 virtual이면 오버라이딩 한 함수도 자동 virtual 포인터의 형에 상관 없이 포인터가 가리키는 객체의 마지막 오버라이딩 함수를 호출한다. 실행결과 현 상황에서의 EmployeeManager 클래스는 모든 객체를 Employee 객체로 간주한다. 따라서 호출하는 함수도 Employee 객체의 멤버함수이다! 바로 이러한 문제의 해결책이 위의 예제에 있다!
급여관리 확장성 문제의 해결과 상속의 이유 윤성우의 열혈 C++ 프로그래밍 GetPay 함수와 ShowSalaryInfo 함수를 Virtual로 선언하였으므로, EmpolyeeHandler가 호출하는 함수는 Employee 클래스의 멤버함수일지라도 실제 호출되는 함수는 각 포인터가 가리키는 객체의 마지막 오버라이딩 함수이다! 이렇듯 상속은 연관된 일련의 클래스들에 대해 공통의 규약을 적용할 수 있게 해 준다!
순수 가상함수와 추상 클래스 윤성우의 열혈 C++ 프로그래밍 몸체가 정의되지 않은 함수를 가리켜 순수 가상함수라 하며, 하나 이상의 순수 가상함수를 멤버로 두어서 객체생성이 불가능한 클래스를 가리켜 추상 클래스라 한다. 오버라이딩의 관계를 목적으로 정의된 함수들! 따라서 몸체부분의 정의는 의미가 없다! 순수 가상함수로 대체 가능!
다형성(Polymorphism) 윤성우의 열혈 C++ 프로그래밍 지금까지 공부한 가상함수와 관련된 내용을 가리켜 ‘다형성’이라 한다! 다형성은 동질이상의 의미를 갖는다. 모습은 같은데 형태는 다르다. 문장은 같은데 결과는 다르다! ptr->Simplefunc 함수의 호출이 다형성의 예!
Chapter 08-3. 가상 소멸자와 참조자의 참조 가능성 윤성우의 열혈 C++ 프로그래밍 Chapter 08-3. 가상 소멸자와 참조자의 참조 가능성 윤성우 저 열혈강의 C++ 프로그래밍 개정판
가상 소멸자(Virtual Destructor) 윤성우의 열혈 C++ 프로그래밍 소멸자를 가상으로 선언함으로써 각각의 생성자 내에서 할당한 메모리 공간을 효율적으로 해제할 수 있다.
참조자의 참조 가능성 윤성우의 열혈 C++ 프로그래밍 실행결과
Chapter 08이 끝났습니다. 질문 있으신지요?