{ 오버라이딩이란 무엇인가? 상속 관계에서의 멤버 함수를 재정의 하는 것을 의미한다. 오버로딩이란 무엇인가? 오버로딩은 함수를 확장한다는 의미이다. .. 사실 다른 함수를 같은 이름으로 만드는것이지만, : ) 안전하지 않은 오버라이딩의 예는 무엇인가? 1. 재정의 함수와 본래함수가 다른 디폴트 매개변수를 사용 할때, 정말 힘든 디버깅을 할 수 있다. 예) #include class Base { public: virtual void Draw( char * p = "두꺼바 두꺼바 헌집 줄께 새집 다오" ) { std::cout
CPPCS 검색 결과
{ 이 글의 취지는 무엇인가? 상속을 잘못되게 사용하지 말라는 것이다. 상속의 정확한 의미가 무엇일까? 상속은 말 그대로, 이어 받는 것을 말하는데, C++에선 상속해 주는 녀석의 행동을 이어 받는 것이다. 그래서 "is-a" 관계라 든지 "works-like-a" 라든지 상속은 이런 관계일 때만 해야 한다고 한다. is-a 관계 : B is a A 라는 관계인데, B가 A로 봐도 무리가 없다면, 상속을 해도 된다.(물론 상속을 하지 않아도 된다면 하지 않는게 좋다) works-like-a 관계 : B works like a A 라는 관계인데, B가 A 처럼 행동해야 할때, 상속을 해도 된다. 물론~ 하지 않아도 되면, 하지 않는게 좋다. 상속으로 코드의 재사용을 하면 안되는 이유가 무엇인가? 상속은 대..
{ 지금까지 상속이 필요하지 않다면, 사용하지 않는게 좋다는 이야기였다면, 이번 항목에서는 상속이 없다면 어려운 것들을 상속을 통해 보다 간단하게 만드는 방법이 있고, 어떻게 만드는 것이 좋은지에 대한 설명이 들어 있었다. 일단 이 책의 내용 중에서, 가장 어렵게 설명한 내용이지 않을까 한다. 어떤 것을 상속을 통해 손쉽게 해결 할 수 있는가? 비유 해서 설명하자면, 개과 동물 들 중에서 Dog 와, Wolf, Dingo, 등이 있다고 하자. 그리고 이 개과 동물들은 "짖는다"라는 행동은 갖으나, 소리가 다르다는 것을 알 수 있을 것이다. 만약, 내가 개과 동물들의 "짖는다"라는 행동을 보고 싶다면, 각 동물마다 "짖는다" 라는 함수를 호출해야 할 것이다. 이 작업이 여간 힘든게 아니다. 각 동물들은 수..
{ 쉽게 말하면, "기반 클래스"로 디자인 되지 않았으니까, 상속하지 않는건 당연하다. 그런데 왜 이런 말이 나오냐 하면, "잘못된 상속"을 사용할 수 있기 때문이다. 기반 클래스로 쓰이는 클래스의 경우, 대부분 다형성을 이용한 객체의 제어 때문에 사용 된다. 이는 상속하는 클래스 B가 기반클래스 A 처럼 행동 해야 할 때인데, 기반 클래스로 디자인하지 않을 경우, 가상 함수가 없다는 것을 의미한다. 이는 가상 소멸자(다형성을 사용하지 않는다면, 그냥 소멸자라도 상관 없다.)가 없어서, 스택이나 힙이 오염될 수 있고, 기반 클래스 A의 의도와 다르게, 상속 클래스 B를 사용 할 수 있다. 왜냐하면, 기반 클래스 A의 성질을 보다 정확하고 잘 아는 사람은 원래의 제작자이다. 그런 제작자가 기반 클래스로 쓰..
{ 상속성을 주의해서 사용해야 하는 이유는 "강력한 관계"는 보다 쉽게 "강력한 상처"를 줄수 있기 때문이다. 상속은 C++ 에서 손에 꼽힐 정도로 강력한 관계를 맺게 해주는 개념이다. 상속을 사용하면, 다음과 같은 이점을 살리기 어려워 진다. 1. 코드의 유연성 A 클래스와 B 클래스가 서로 독립 될 수 있는 경우, 각각의 변경은 서로에게 영향을 미치지 않으므로, 언제 어디서든 A는 B와는 상관 없이, B는 A와 상관없이 사용 될 수 있다. 2. 빠른 컴파일 각각의 변화에 따른 컴파일을 할 필요가 없다. 만약 B 클래스가 A 클래스를 상속해서 구현되었다면, A 클래스의 변화가 있을 때마다 B 클래스 역시 재컴파일 해야 하는 시간을 내놓아야 한다. 3. 적은 혼란 각각 독립적이기 때문에, 한 클래스에만 ..
{ 왜냐하면 클래스를 어정쩡하게 만들면, 가독성이나 각종 논리적 에러에 혼란이 오기 때문이다. 일반적으로 각 상황에 맞는 클래스 작성법을 설명한다. 값들을 저장하는 클래스 1. 복사 할당자, 복사 생성자가 존재한다. 2. 가상 함수가 없다. 3. 클래스의 객체 자체가 직접 사용 된다. 4. 기본 자료형 처럼 쓰인다. 기반 클래스 1. 공용이면서 가상이거나 보호된 가상이 아닌 소멸자가 있다. 2. 가상 함수가 있다. 3. 인스턴스는 대개 힙이나 스마트 포인터로 만든다. 특성 클래스 1. typedef와 정적 함수만 있으며. 상태 변경이 불가능하다. 2. 함수 오버로딩의 분기 조건에 많이 쓰인다. 정책 클래스 1. 특정한 클래스들에게 어떻게 구현해야 되는지 강제하기 위해서 사용 한다.(복사 할당, 생성이 안..
최근댓글