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; 
} 

мне нужно использовать интерфейс ITimer в классе А, но метод реализован в классе В. Таким образом, я унаследовал интерфейс в A, но компилятор не доволен этим:

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' 

Как я мог бы использовать интерфейс в BaseClass А, а его метод реализован в классе В.

Спасибо.

+2

Почему '' A' наследует ITimer'? – Nawaz

+0

Какой компилятор вы используете? – Saravanan

+0

@Nawaz: «Мне нужно использовать интерфейс ITimer в классе A, но метод реализован в классе B. Таким образом, я унаследовал интерфейс в A,' – Jichao

ответ

4

Наследование является базовым классом всех злых дел.

A ни BявляютсяITimer сек

даже не реализует чисто виртуальные, поэтому он не может быть создан. Поэтому наследование от A составляет Cаннотация тоже (не может быть экземпляр).

Вы не хотите использовать наследование здесь. См


В этом случае Страшный алмазов из-смерти иерархия может быть исправлена ​​путем добавления virtual:

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

Посмотри Live on IdeOne. Я не рекомендую это. Подумайте об исправлении дизайна.

Смотрите также Diamond inheritance (C++)

+0

+1 для «Рассмотрите возможность установки дизайна». – rightfold

Смежные вопросы