''상속 은하계로 진입했습니다'' ''패시브 스킬 <다형성>을 습득했습니다. 도달도 3/20'' [[TableOfContents]] = 미시Cpp = 회차 : 3회차 시간 : 12시 ~ 14시 30분 장소 : 6층 학회실 == 참가원 == || 멘토 || 장용운 || 출석 || ||<|2> 멘티 || 유재범 || 출석 || || 신형철 || 출석 || == 이번에 배울 것 == * 상속 ○ public, private, protected * 상속과 객체 생명주기 * virtual과 overriding ○ overriding 개념 ○ virtual 선언 ○ overloading된 메서드의 overriding * 부모 클래스의 참조 * 서브클래스의 디폴트 대입 연산자, 복사 생성자 * 업 캐스팅과 다운 캐스팅 * pure virtual method와 abstract class * virtual 소멸자 * vtable과 다형성의 원리 * 다중 상속과 virtual base class * RTTI(Run-time type information) * ★(C++11)상속 방지 * ★(C++11)오버라이딩 방지 * ★(C++11)override 키워드 * ★(C++11)생성자 상속 * (실습)상속 관계 디자인하기 * (실습)클래스 작성 = 스터디 진행 = == 내용 == == 코드 == * private, protected, public 상속 {{{ class TestClass { private: void privateDo(); protected: void protectedDo(); public: void publicDo(); }; class InheritencePrivate : private TestClass {}; // private보다 넓은 공유 범위를 가지는 것들을 private로 전환하여 상속 class InheritenceProtected : protected TestClass {}; // protected보다 넓은 공유 범위를 가지는 것들을 protected로 전환하여 상속 class InheritencePublic : public TestClass {}; // 그대로 상속 void main() { InheritencePrivate a; InheritenceProtected b; InheritencePublic c; a.privateDo(); a.protectedDo(); a.publicDo(); // 모두 컴파일 에러 b.privateDo(); b.protectedDo(); b.publicDo(); // 모두 컴파일 에러 c.privateDo(); c.protectedDo(); c.publicDo(); // publicDo 제외 컴파일 에러 } }}} * virtual과 overriding {{{ #include class TestClass { private: void privateDo(); protected: void protectedDo(); public: virtual void publicDo(); virtual void publicDo(int num); void publicDo_2(); }; class Inheritence : public TestClass { public: void publicDo(); void publicDo(int num); void publicDo_2(); }; void main() { Inheritence * inst = new Inheritence(); TestClass * tcInst = new TestClass(); inst->publicDo(); inst->publicDo_2(); TestClass * convertInst = new TestClass(); convertInst = (TestClass *) inst; convertInst->publicDo(); convertInst->publicDo_2(); // 다형성은 포인터 변수의 자료형을 기준으로 하며, virtual이 선언되어 있지 않으면 적용되지 않음. /* output Inheritence publicDo Inheritence publicDo_2 Inheritence publicDo TestClass publicDo_2 */ } void TestClass::publicDo() { std::cout << "TestClass publicDo" << std::endl; } void TestClass::publicDo(int num) { std::cout << "TestClass overloading publicDo" << std::endl; } void Inheritence::publicDo() { std::cout << "Inheritence publicDo" << std::endl; } void Inheritence::publicDo(int num) { std::cout << "Inheritence overloading publicDo" << std::endl; } void TestClass::publicDo_2() { std::cout << "TestClass publicDo_2" << std::endl; } void Inheritence::publicDo_2() { std::cout << "Inheritence publicDo_2" << std::endl; } }}} * 순수 가상 함수 {{{ class TestClass { private: void privateDo(); protected: void protectedDo(); public: virtual void publicDo() = 0; // 이 메서드는 순수 가상 함수로, 자식 클래스에서 반드시 재정의 virtual void publicDo(int num); void publicDo_2(); }; // 순수 가상 함수가 하나 이상있으면 추상 클래스 취급되어 인스턴스 생성 불가능 }}} * 상속/오버라이드 방지 및 override 키워드 {{{ class TestClass final // 이럴 경우 상속 불가능 { private: void privateDo(); protected: void protectedDo(); public: virtual void publicDo() final; // 이럴 경우 오버라이딩 불가능 virtual void publicDo(int num); void publicDo_2(); }; class Inheritence : public TestClass { public: void publicDo(); void publicDo(int num) override; // override 한 것을 명시적으로 표현함 (매개 변수 등에서 에러가 날 경우 방지할 수 있음) void publicDo_2(); }; }}} = 잡담 = * 유서 * 어머니 소자 먼저 갑니다 - [유재범] * 코드 편집중입니다. - [신형철] --------------------------------------------------------------------- [활동지도/2015] [미시Cpp]