2013-09-26 2 views
1

는 :기본 클래스에서 인터페이스를 사용하는 방법? 다음 코드를 고려

#include <stdio.h> 
struct ITimer { 
    virtual void createTimer() = 0; 
}; 
class A : public ITimer 
{ 
    public: 
     void showA() { 
      printf("showA\n"); 
      createTimer(); 
     } 
}; 

class B : public ITimer 
{ 
    public: 
     void showB() { 
      printf("showB\n"); 
     } 
     void createTimer() { 
      printf("createTimer"); 
     } 
}; 

class C: public A, public B 
{ 
    public: 
     void test() { 
      showA(); 
      showB(); 
     } 
}; 

int main() 
{ 
    C c; 
    c.test(); 
    return 0; 
} 
내가 클래스 A의 인터페이스 ITimer를 사용할 필요가

하지만 방법은 클래스 B에서 구현 그래서 나는 A의 인터페이스를 상속하지만, 컴파일러는 그것으로 행복하지 않다 :

그 방법은

감사 클래스 B에서 구현되는 동안

test.cc 
test.cc(38) : error C2259: 'C' : cannot instantiate abstract class 
     due to following members: 
     'void ITimer::createTimer(void)' : is abstract 
     test.cc(5) : see declaration of 'ITimer::createTimer' 

어떻게의 base class A의 인터페이스를 사용할 수 있습니다.

+2

왜'A' 상속'ITimer'은 무엇입니까? – Nawaz

+0

어떤 컴파일러를 사용하고 있습니까? – Saravanan

+0

@Nawaz : 클래스 A에서 인터페이스 ITimer를 사용해야하지만 메서드는 클래스 B에서 구현됩니다. 따라서 A에서 인터페이스를 상속받습니다. – Jichao

답변

4

상속은 모든 악의 기본 클래스입니다.

ABITimer

A는 심지어 순수 가상을 구현하지 않는, 그래서 그것을 인스턴스화 할 수 없습니다. 따라서 A에서 상속하면 C추상화 (인스턴스화 할 수 없음)이됩니다.

여기에서는 상속을 사용하지 않으려합니다.


, 계층 구조이 virtual을 추가하여 고정 될 수있는 다이아몬드의 죽음 지칠대로 지친 :

class A : public virtual ITimer 
//... 
class B : public virtual ITimer 

Live on IdeOne 그러나 나는 이것을 추천하지 않는다. 디자인 수정을 고려하십시오.

도 참조 Diamond inheritance (C++)

+0

+1 "디자인 수정 고려." – rightfold

관련 문제