이번 항목은 한가지 전제를 깔고, 그 문제를 풀어보면서 "앞으로 이런 문제에 부딛쳐 힘에 지칠 때 도움이 될 것이다" 라고 이야기 한다. 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 을 두개 가지게 되는 문제가 생긴다.(이런 간접적인 두개일 경우 문제로 지적되는 것이 바로 초기화 문제를 들 수..
함수 템플릿의 경우 템플릿 매개변수가 함수의 인자에서 추론 될 수 있음을 알게 되었다. 이 추론 때문에, 함수 오버로딩이란 기능을 이용하기 위해선, 몇가지 규칙을 이해하고 있어야 하는 리스크가 있다. 물론 함수 템플릿을 사용 하는것에 비하면 아무것도 아니지만...우선 코드를 보고, 어느게 호출 될지 생각해 보자. #include template T sqrt( T ); template T std::complex sqrt( std::complex ); double sqrt( double ); void f( std::complex z ) { sqrt( 2 ); sqrt( 2.0 ); sqrt( z ); } 13, 14, 15 라인에서 어떤 함수가 호출 될 것이라고 생각 하는가? 13 라인에선 맨 위의 함수 템..
시작하기 앞서 한가지 중요한 사실을 짚어 본다면 " 함수 템플릿에서 템플릿 매개변수는 함수의 인자에 의해서 추론 된다" 를 알고 있어야 할것 같다. 이 추론 될 수 있음으로 추론 되는 방법을 알아야 되기 때문이다. 이 추론 되는 방법은 함수 오버로딩과 깊은 연관이 있으며, 어떤 함수를 호출할지도 판별하게 되기 때문이다. 우선 컴파일러는 함수 호출 문을 보고, 템플릿 매개변수와 매칭을 시키는데, 이때 함수의 인자가 함수의 템플릿 매개변수를 모두 사용 할 때, 인자를 템플릿 매개변수로써 판별 할 수 있다. 만약 템플릿 매개변수를 함수의 인자로 모두 사용 하지 않는 다면, 명시적으로 에 넣어 주어야만 한다. 이 함수 템플릿과 클래스 템플릿의 큰 차이는 바로 이 추론에 있다. 함수 템플릿은 인자로 추론하여, 템..
다음 문구는 비야네 스트롭 스트룹의 "The C++ Programming Language"의 13장, 템플릿의 처음 부분의 것을 인용한 것이다. " '개념(concept)'이라 하는 것은 그 자체의 독립성이 보장될 때는 독립적으로 표현되어야 마땅하며, 다른 개념과 결합시키려면 나음대로의 합당한 이유가 있어야 한다. 이것은 원칙이며, 이 것이 깨진다면, 이상한 개념들의 뭉치와 불필요한 의존구조만이 난무한 산업폐기물만이 하나 더 추가 될 뿐이다. " 또한 다음과 같이 마무리 한다. " 독립과 결합, 이 두 가지를 어떻게 선택하든지 둘 중 하나라도 지키지 않으면, 소프트웨어 구성에 필요한 구성요소를 선택하는 데 있어서 상당 부분의 융통성을 잃게 된다는 것을 확실하다. C++ 에는 이런 문제에 대한 해결책을 가..
최근댓글