C++ of the Day #3 - Multiply inherit from classes with conflicting function names

Question

역시 C++ 뉴스그룹에 올라온 것으로 찾아보면 자주 반복되어 온 질문중의 하나입니다. ((comp.lang.c++.moderated:Multiply inherit from classes with conflicting function names))
struct A {
  virtual long fun() = 0;
};
struct B {
  virtual bool fun() = 0;
};
struct Unfortunate : public A, public B {
  ???
}; 
질문을 요약해보면...
  1. ???부분을 합법적인 코드를 가지고 구현할 수 있는가?
  2. 물론 두 fun 함수 모두 각자의 구현을 가져야 한다.

Answer

워낙 많이 다루어진 질문이라 바로 답으로 넘어갑니다. 여기서 답이라는 것은 일반적으로 이런 방법을 사용한다는 뜻입니다.
다음과 같이 중간 계층의 클래스를 추가하여 각 함수에 고유의 이름을 줌으로써 각각의 함수 구현이 가능합니다.
struct Abis : A {
  virtual long funA() = 0;
  virtual long fun() { return funA(); }
};
struct Bbis : B {
  virtual bool funB() = 0;
  virtual bool fun() { return funB(); }
};
struct Unfortunate : Abis, Bbis {
  virtual long funA() { ... }
  virtual bool funB() { ... }
}; 

위의 코드를 사용하여 다음과 같이 사용할 수 있습니다.
Unfortunate u;
u.funA();
u.funB();
A* a = &u;
B* b = &u;
a->fun(); // call long Unfortunate::funA()
b->fun(); // call bool Unfortunate::funB()


2006-06-05 추가

관련된 읽은만한 글이 있어 추가합니다. 이제는 없어진 Herb와 Jim의 추억의 Conversation 컬럼이군요. - Adaptation

Comments

Popular Posts