c++_study 18.8 Virtual base classes 17.9의 multiple inheritance에서 우리는 diamond problem에 대해서 잠깐 이야기 했었다 이번 섹션에서 우리는 이에 대한 논의를 계속해본다 우리는 위의 관계를 생각하고 있지만 만약 우리가 copier class object를 만든다면 프로그램은 위처럼 인식해 PoweredDevice를 두번 생성할 것이다 이를 해결하기 위해 우리는 virtual 키워드를 이용해 vi... c++_studyc++_study M.2 R-value references 챕터 1에서 우리는 l-value와 r-value에 대해서 이야기 했었다 c++03 이전에는 l-value와 r-value 두가지 value cateogyr만 이용 가능했다 modifiable l-value, 그리고 non-modifiable l-value(const) r-value는 간단하게 l-value가 아닌 모든 것이라고 생각하면 된다. 그러나 c++11에서는 l-value refer... c++_studyc++_study 17.9 Multiple inheritance 이제껏 다룬 inheritance는 모두 single inheritance였다 하지만 c++에서는 multiple inheritance도 지원하고 있다 이는 복수의 클래스에서 상속받을 수 있는 것이 가능하다는 것을 의미한다 언뜻 보기에는 간단해 보이나 다중상속은 프로그램을 복잡하고 유지하기 어렵게 만든다 첫째, 모호성이 발생할 수 있다. 예를 들어 두개의 parent에 똑같은 함수가 존재할 ... c++_studyc++_study 17.5 Inheritance and access specifiers 이번 섹션에서는 public, private, protected에서 자세하게 살펴볼 예정이다 우리는 public과 private이라는 access specifiers에 대해서 본적이 있다 빠르게 복습하자면 public member는 어디에서나 접근이 가능하고 private는 같은 클래스의 member function에서만 접근이 가능하다 따라서 derived class에서 base의 priv... c++_studyc++_study 19.1 — Template classes 우리는 이전 챕터에서 function template에 대해서 다룬적 있다 function template은 다른 여러 타입으로도 function을 기능할 수 있게 도와주웠다 우리는 이러한 template이 할 수 있는 더 많은 것들에 대해서 살펴본다 우리는 클래스에 template을 접목해서 일반화된 container class를 만들 수 있다 Array.h: function templat... c++_studyc++_study 19.2 Template non-type parameters 이전 수업에서 우리는 template type parameter를 이용하여 type independant한 function과 class를 만든 것에 대해서 배웠다 하지만 template type parameter만이 유일한 사용처가 아니다 template class와 function은 non-type parameter라고 알려진 것도 만들 수 있다 A non-type parameter can... c++_studyc++_study 19.3 Function template specialization 만약 member function이 특정 parameter type의 class object에서 특별한 functionality를 원하는 경우에 다음과 같은 방법으로 가능하다 다음과 같은 일반적인 template class가 있다 위와 같이 실행하면 출력은 다음과 같다 그런데 우리가 double의 경우 출력을 특별하게 하고 싶다 이때 다음과 같은 코드를 사용해 print함수를 cutomizi... c++_studyc++_study 17.2 Basic inheritance in C++ Inheritance는 c++에서 클래스 사이에 위치하는 개념이다. Inheritance(is-a) 관계에서 상속해주는 클래스는 parent class, base class, superclass라고 불리우고 상속 받는 클래스는 child class, derived(파생된) class, subclass라고 불리운다 (derive는 파생하다, 유래하다) 예시를 통해서 빠르게 살펴보자 Baseba... c++_studyc++_study 17.3 Order of construction of derived classes 우리는 전 레슨에서 inheritance의 basic에 대해서 살펴보았다 클래스가 다른 클래스로부터 멤버 변수와 함수를 상속받을 수 있다는 것을 알 수 있었다 이번 섹션에서는 derived class가 instantiate될 때 construction의 순서에 대해서 알아본다 Base를 public 상속받는 Derived가 instantiate되면 Base의 constructor가 먼저 호출... c++_studyc++_study 17.4 Constructors and initialization of derived classes 현재까지 배운 방법으로는 derived class에서 base class의 member variable을 초기화하거나 그러지 않았다. 우리가 instantiate하면 derived class의 constructor가 호출되는데 여기에 base class의 멤버 변수를 조작하지는 않았다 그렇다면 derived class에서 base class의 멤버변수를 초기화하면 되지않을까? 그리고 base... c++_studyc++_study 17.6 Adding new functionality to a derived class 우리는 챕터 17의 시작에서 derived class의 최대 이익 중 하나는 이미 작성된 코드를 재사용할 수 있다는 것을 들었었다 우리는 base class의 functionality를 상속받을 수 있고 새로운 functionality를 추가할 수도 있으며 이미 존재하는 functionality를 수정하거나 원하지 않는 것은 hide할 수도 있다 남은 lesson들을 통해서 이들을 배워보자 ... c++_studyc++_study 17.7 Calling inherited functions and overriding behavior derived class object의 member function을 호출한다면, 컴파일러는 먼저 derived class에 member function이 있는지 찾아볼 것이다 만약 존재하지 않는다면 inheritance chain을 타고 올라고 member가 존재하는지 찾아볼 것이다 위의 출력의 결과는 다음과 같다 I am a Base I am a Base main에서 derived.ide... c++_studyc++_study 17.8 Hiding inherited functionality C++은 우리가 child class에서 parent class의 member's access specifier를 수정할 수 있도록 하고 있다. 이는 using declaration을 통해 가능하게 하고 있다. using을 derived class에서 access specifier하에서 하게되면 access specifier가 derived class에서 만큼은 수정되는 것이다 위의 Base... c++_studyc++_study 18.4 Virtual destructors, virtual assignment, and overriding virtualization 비록 c++이 default destructor를 제공하고 있지만 가끔씩 우리는 직접 만들어야할 필요가 있다 (특히 메모리를 deallocate 해야하는 상황에) 만약 우리가 inheritance를 다루고 있다면 우리는 반드시 우리의 destructor를 virtual로 만들어야 한다 다음의 예시를 보자 main 함수에서 base는 Base pointer 이므로 base가 delete되면 프... c++_studyc++_study 18.7 Pure virtual functions, abstract base classes, and interface classes 우리가 이제껏 사용했던 모든 virtual function은 body가 존재했다 (definition) 그러나 c++은 pure virtual function이라는 특별한 종류의 함수를 만드는 것을 허용한다 이는 body가 없다. 이는 간단하게 placeholder로 역할한다고 보면된다 pure virtual function을 만드는 것은 body가 아닌 0을 assign하면 된다 위의 예시... c++_studyc++_study 18.9 Object slicing 우리는 이제까지 Base ptr 혹은 ref로 derived class object를 받아와서 사용하곤 했다 이러한 경우에 object는 비록 Base prt, ref 타입이지만 원본은 Derived portion이 존재한다 그리고 virtual을 통해 이러한 부분에 접근할 수 있었다 하지만 단순히 Base object에 Derived object를 assign하면 어떻게 될까? Derive... c++_studyc++_study 18.10 Dynamic casting polymorphism을 다룰 때 우리는 종종 base class의 pointer를 가지고 있을 때 derived class의 정보에 접근하고 싶을 때가 있다 그러나 pointer는 Base 혹은 Derived object 둘 다 pointing할 수 있다. 이러한 상황에서 pointer가 Derived object를 pointing하는 경우 우리는 어떻게 Derived::getName()을... c++_studyc++_study 18.11 Printing inherited classes using operator<< virtual function을 사용하는 다음 프로그램을 살펴보자 이제 우리는 b.print가 Derived::print()를 호출하는 것에 대해서 이해하고 있다 우리가 이를 std::cout과 연계를 하고 싶은데 현재 형태에서는 깔끔하게 이를 사용할 수 없다 b.print()가 std::cout이 존재하므로 위처럼 써야한다 이상적으로는 다음과 같이 쓴는게 깔끔해보인다 operator<<에 ... c++_studyc++_study
18.8 Virtual base classes 17.9의 multiple inheritance에서 우리는 diamond problem에 대해서 잠깐 이야기 했었다 이번 섹션에서 우리는 이에 대한 논의를 계속해본다 우리는 위의 관계를 생각하고 있지만 만약 우리가 copier class object를 만든다면 프로그램은 위처럼 인식해 PoweredDevice를 두번 생성할 것이다 이를 해결하기 위해 우리는 virtual 키워드를 이용해 vi... c++_studyc++_study M.2 R-value references 챕터 1에서 우리는 l-value와 r-value에 대해서 이야기 했었다 c++03 이전에는 l-value와 r-value 두가지 value cateogyr만 이용 가능했다 modifiable l-value, 그리고 non-modifiable l-value(const) r-value는 간단하게 l-value가 아닌 모든 것이라고 생각하면 된다. 그러나 c++11에서는 l-value refer... c++_studyc++_study 17.9 Multiple inheritance 이제껏 다룬 inheritance는 모두 single inheritance였다 하지만 c++에서는 multiple inheritance도 지원하고 있다 이는 복수의 클래스에서 상속받을 수 있는 것이 가능하다는 것을 의미한다 언뜻 보기에는 간단해 보이나 다중상속은 프로그램을 복잡하고 유지하기 어렵게 만든다 첫째, 모호성이 발생할 수 있다. 예를 들어 두개의 parent에 똑같은 함수가 존재할 ... c++_studyc++_study 17.5 Inheritance and access specifiers 이번 섹션에서는 public, private, protected에서 자세하게 살펴볼 예정이다 우리는 public과 private이라는 access specifiers에 대해서 본적이 있다 빠르게 복습하자면 public member는 어디에서나 접근이 가능하고 private는 같은 클래스의 member function에서만 접근이 가능하다 따라서 derived class에서 base의 priv... c++_studyc++_study 19.1 — Template classes 우리는 이전 챕터에서 function template에 대해서 다룬적 있다 function template은 다른 여러 타입으로도 function을 기능할 수 있게 도와주웠다 우리는 이러한 template이 할 수 있는 더 많은 것들에 대해서 살펴본다 우리는 클래스에 template을 접목해서 일반화된 container class를 만들 수 있다 Array.h: function templat... c++_studyc++_study 19.2 Template non-type parameters 이전 수업에서 우리는 template type parameter를 이용하여 type independant한 function과 class를 만든 것에 대해서 배웠다 하지만 template type parameter만이 유일한 사용처가 아니다 template class와 function은 non-type parameter라고 알려진 것도 만들 수 있다 A non-type parameter can... c++_studyc++_study 19.3 Function template specialization 만약 member function이 특정 parameter type의 class object에서 특별한 functionality를 원하는 경우에 다음과 같은 방법으로 가능하다 다음과 같은 일반적인 template class가 있다 위와 같이 실행하면 출력은 다음과 같다 그런데 우리가 double의 경우 출력을 특별하게 하고 싶다 이때 다음과 같은 코드를 사용해 print함수를 cutomizi... c++_studyc++_study 17.2 Basic inheritance in C++ Inheritance는 c++에서 클래스 사이에 위치하는 개념이다. Inheritance(is-a) 관계에서 상속해주는 클래스는 parent class, base class, superclass라고 불리우고 상속 받는 클래스는 child class, derived(파생된) class, subclass라고 불리운다 (derive는 파생하다, 유래하다) 예시를 통해서 빠르게 살펴보자 Baseba... c++_studyc++_study 17.3 Order of construction of derived classes 우리는 전 레슨에서 inheritance의 basic에 대해서 살펴보았다 클래스가 다른 클래스로부터 멤버 변수와 함수를 상속받을 수 있다는 것을 알 수 있었다 이번 섹션에서는 derived class가 instantiate될 때 construction의 순서에 대해서 알아본다 Base를 public 상속받는 Derived가 instantiate되면 Base의 constructor가 먼저 호출... c++_studyc++_study 17.4 Constructors and initialization of derived classes 현재까지 배운 방법으로는 derived class에서 base class의 member variable을 초기화하거나 그러지 않았다. 우리가 instantiate하면 derived class의 constructor가 호출되는데 여기에 base class의 멤버 변수를 조작하지는 않았다 그렇다면 derived class에서 base class의 멤버변수를 초기화하면 되지않을까? 그리고 base... c++_studyc++_study 17.6 Adding new functionality to a derived class 우리는 챕터 17의 시작에서 derived class의 최대 이익 중 하나는 이미 작성된 코드를 재사용할 수 있다는 것을 들었었다 우리는 base class의 functionality를 상속받을 수 있고 새로운 functionality를 추가할 수도 있으며 이미 존재하는 functionality를 수정하거나 원하지 않는 것은 hide할 수도 있다 남은 lesson들을 통해서 이들을 배워보자 ... c++_studyc++_study 17.7 Calling inherited functions and overriding behavior derived class object의 member function을 호출한다면, 컴파일러는 먼저 derived class에 member function이 있는지 찾아볼 것이다 만약 존재하지 않는다면 inheritance chain을 타고 올라고 member가 존재하는지 찾아볼 것이다 위의 출력의 결과는 다음과 같다 I am a Base I am a Base main에서 derived.ide... c++_studyc++_study 17.8 Hiding inherited functionality C++은 우리가 child class에서 parent class의 member's access specifier를 수정할 수 있도록 하고 있다. 이는 using declaration을 통해 가능하게 하고 있다. using을 derived class에서 access specifier하에서 하게되면 access specifier가 derived class에서 만큼은 수정되는 것이다 위의 Base... c++_studyc++_study 18.4 Virtual destructors, virtual assignment, and overriding virtualization 비록 c++이 default destructor를 제공하고 있지만 가끔씩 우리는 직접 만들어야할 필요가 있다 (특히 메모리를 deallocate 해야하는 상황에) 만약 우리가 inheritance를 다루고 있다면 우리는 반드시 우리의 destructor를 virtual로 만들어야 한다 다음의 예시를 보자 main 함수에서 base는 Base pointer 이므로 base가 delete되면 프... c++_studyc++_study 18.7 Pure virtual functions, abstract base classes, and interface classes 우리가 이제껏 사용했던 모든 virtual function은 body가 존재했다 (definition) 그러나 c++은 pure virtual function이라는 특별한 종류의 함수를 만드는 것을 허용한다 이는 body가 없다. 이는 간단하게 placeholder로 역할한다고 보면된다 pure virtual function을 만드는 것은 body가 아닌 0을 assign하면 된다 위의 예시... c++_studyc++_study 18.9 Object slicing 우리는 이제까지 Base ptr 혹은 ref로 derived class object를 받아와서 사용하곤 했다 이러한 경우에 object는 비록 Base prt, ref 타입이지만 원본은 Derived portion이 존재한다 그리고 virtual을 통해 이러한 부분에 접근할 수 있었다 하지만 단순히 Base object에 Derived object를 assign하면 어떻게 될까? Derive... c++_studyc++_study 18.10 Dynamic casting polymorphism을 다룰 때 우리는 종종 base class의 pointer를 가지고 있을 때 derived class의 정보에 접근하고 싶을 때가 있다 그러나 pointer는 Base 혹은 Derived object 둘 다 pointing할 수 있다. 이러한 상황에서 pointer가 Derived object를 pointing하는 경우 우리는 어떻게 Derived::getName()을... c++_studyc++_study 18.11 Printing inherited classes using operator<< virtual function을 사용하는 다음 프로그램을 살펴보자 이제 우리는 b.print가 Derived::print()를 호출하는 것에 대해서 이해하고 있다 우리가 이를 std::cout과 연계를 하고 싶은데 현재 형태에서는 깔끔하게 이를 사용할 수 없다 b.print()가 std::cout이 존재하므로 위처럼 써야한다 이상적으로는 다음과 같이 쓴는게 깔끔해보인다 operator<<에 ... c++_studyc++_study