혹시 순수 가상 함수를 사용 해본적이 있는가? 그렇다면 어떤 함수를 순수 가상함수로 만들어서 사용 했는가? 이 번 항목에선 이런 질문들을 정리하기 위한 항목이라 봐도 좋을 듯 싶다. 질문 1. 순수 가상 함수는 무엇인가? 예를 들어라. class pure_virtual_function_class { public: virtual ~pure_virtual_function_class() = 0; }; 질문 2. 순수 가상 함수를 선언하고 정의를 작성하는 이유는? 생각해 낼 수 있는 모든 이유나 상황을 제시하라. ① 순수 가상 소멸자를 위해서 알디 시피 순수 가상 소멸자를 만들어야만 할 경우, 그 소멸자의 본체도 정의해 두어야 한다. 왜냐하면 가상 소멸자의 호출 매카니즘이 파생 소멸자에서 기본 클래스 소멸자를 ..
책 정리/More Exceptional C++ 검색 결과
이번 항목은 한가지 전제를 깔고, 그 문제를 풀어보면서 "앞으로 이런 문제에 부딛쳐 힘에 지칠 때 도움이 될 것이다" 라고 이야기 한다. class BaseA { virtual int ReadBuf( const char* ); /* 우스갯소리 : 이 안에 BaseA가 있다. */ }; class BaseB { virtual int ReadBuf( const char* ); /* 우스갯소리 : 이 안에 BaseB가 있다. */ }; 이 BaseA 와 BaseB에 있는 ReadBuf 는 다른 일을 하지만 같은 시그너처를 가진 함수 이다. 이 두 클래스를 public 상속을 한 Derived 클래스를 만들고, 각기 다른 ReadBuf가 호출 될 수 있도록 오버라이드 하라. 해설 처음에 내가 생각해 낸 방법은,..
이번 항목은 "만약" 이라는 전제와 "상상" 이라는 생각을 통해, 다중 상속을 "자연스럽게 에뮬레이션" 해 보자. 라는 취지로 이야기 한다. 다음 예제코드를 보자 #include #include class A { public: virtual ~A(); std::string Name(); private: virtual std::string DoName(); }; class B1 : virtual public A { std::string DoName(); }; class B2 : virtual public A { std::string DoName(); }; A::~A() { } std::string A::Name() { return DoName(); } std::string A::DoName() { retu..
몇몇 프로그래밍 언어에서 다중 상속을 지원할지 단일 상속을 지원 할지, 프로그래밍 언어가 상속을 어디까지 지원해 주는게 좋을지 논쟁이 계속 되고 있다고 한다. 이 논쟁을 우리도 함께 해보자는 취지로 만들어진 항목이 바로 More Exeptional C++ 24항목에 나와 있다. 1. 다중 상속(MI)은 무엇이고, MI를 C++에 도임함으로써 생길 수 있는 가능성이나 문제점에는 무엇이 있나? 위 그림이 바로 다중 상속(MI)을 아주 잘 보여주고 있다. Bat 은 Mammalia 와 Bird 를 상속하므로써 MI 다. 라고 말할 수 있다. 문제점은 그림에서 봤듯이 Bat 은 간접적으로 Animal 을 두개 가지게 되는 문제가 생긴다.(이런 간접적인 두개일 경우 문제로 지적되는 것이 바로 초기화 문제를 들 수..
이게 난이도 6 인가, : ) 한 8쯤 되는줄 알았는데, 더 정진해야겠다. 이번 항목을 클래스안에서 적용 될 것을 계산하여 스마트 포인터를 만들어 보는 항목이다. 알다 시피 클래스 안에서 스마트 포인터를 사용 할 때는 다음 4가지 경우를 반드시 생각해 봐야 한다. 첫째, 클래스의 생성자에서 어떻게 작동 하게 할 것인가? 둘째, 클래스의 소멸자에서 어떻게 작동 하게 할 것인가? 셋째, 클래스의 복사 생성자에서 어떻게 작동 하게 할 것인가? 넷째, 클래스의 복사 할당자에서 어떻게 작동 하게 할 것인가? 이번 항목은 이렇게 질문 4개에 대한 답변들로 이루어 졌다. 일전에 babo_ptr을 제작해보았던 터라 이 문제에 대해서 생각하여, 그 대처 방안으로 썼었는데, 다시 정리 하려 하니 귀찮다. 왜냐하면 결론을 ..
알다 시피 C++ 프로그래머에게 있어, 클래스의 멤버가 pointer 일 경우 각별한 주의가 필요로 한다는 것은 알 것이다. 그렇다면, 영리한 포인터 녀석들을 넣을 경우, 생길 수 있는 문제점을 알고 있는가? 이번 항목은 그런 문제에 대해서 이야기 하고 생각해 보는 시간을 갖기 위해 존재 한다. 질문 1. 다음 코드가 매우 불안한 이유는? class X1 { ~X1() { delete p_ } X1( int * p ) p_( p ) { } // 컴파일러가 만들어 주는 복사 생성자와 // 복사 할당자를 이용 한다. private: int *p_; }; 단번에 알겠지만, 메모리 누수가 일어 나거나, 두번 릴리즈 하게 된다. 질문 2. 그렇다면 스마트 포인터를 사용 한다면, 어떤 문제가 있을까? class X..
최근댓글