1

Я пытаюсь сделать то, что я действительно не делал раньше. У меня в основном есть 3 класса. Класс A - это абстрактный класс с чистыми виртуальными методами, класс B - это собственный класс, который содержит методы с тем же именем, что и виртуальные методы класса A. Я пытаюсь связать все вместе в классе C. Я бы хотел наследовать классы B и A в C (множественное наследование) и использовать методы из класса B для реализации классов в классе A. Таким образом я создаю модульный подход. Пример ниже - очень упрощенная версия моего кода.Реализовать абстрактные методы из унаследованного класса

class A { 
virtual int methodA() = 0; 
virtual int methodB() = 0; 
virtual int methodC() = 0; 
}; 

class B { //B implements A.A() and A.B() 
int methodA() { return 0; }; 
int methodB() { return 0; }; 
}; 

class C : A, B { 
int methodC() { return 0; }; //C implements A.C() 
}; 

я могу скомпилировать класс C, но когда я пытаюсь построить класс C new C() я получаю сообщение компилятора о том, «не может создать экземпляр абстрактного класса из-за следующих членов: Int Methoda()»: абстрактно».

Есть ли способ реализовать класс A, используя класс B через множественное наследование в классе C?

Редактировать: Желание сохранить класс B бетоном.

+0

Что, кажется, проблема с наличием 'B' реализовать методы напрямую? –

+0

@MarkB Я хочу, чтобы B был многоразовым. Класс A содержит метод, реализованный в классе C. –

+0

Если вы действительно хотите это сделать, вы можете реализовать фиктивный метод для B. Единственная причина, по которой я говорю, «если вы действительно этого хотите», - это потому, что у нее нет очень хороший «запах кода». Возможно, вы можете объяснить немного больше о реальной проблеме, которую вы пытаетесь решить, и кто-то здесь может дать вам альтернативную реализацию. – DubiousPusher

ответ

0

Вы можете сделать это с помощью шаблона метода по методу.

class A { 
public: 
virtual int methodA() = 0; 
virtual int methodB() = 0; 
virtual int methodC() = 0; 
}; 

class B { //B implements A.A() and A.B() 
public: 
int methodA() { return 0; }; 
int methodB() { return 0; }; 
}; 

class C : public A, public B { 
public: 
int methodA() { return B::methodA(); } 
int methodB() { return B::methodB(); } 
int methodC() { return 0; }; //C implements A.C() 
}; 

Демо: http://ideone.com/XDKDW9

+0

Это полностью работает. Благодаря! –

+0

'B' не должен быть базовым классом (без виртуального деструктора для стартеров) – TemplateRex

+1

@TemplateRex Я думаю, вы могли бы исправить это, просто используя частное наследование для' B'. –

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