Вызов метода базового класса из другого базового класса, который наследует ребенок

class A {
void methodToCall() {};
}

class B {
B() {
subscribeToEvent();
}
void eventHandler(Event* E) {
call A::methodToCall()
}
}

class C : public A, public B{
}

Это может показаться редкой ситуацией, поэтому позвольте мне объяснить, что я пытаюсь сделать.

У меня есть много классов, которые похожи на класс А. Они созданы другой структурой, поэтому я не могу контролировать, как они создаются.

Для каждого класса А у меня есть один или несколько классов Скоторые наследуют такой класс, как А.

Я разработал необходимость вызова A :: MethodToCall (), когда вызывается eventHandler (). Моя цель — не подписываться и не предоставлять метод eventhadler во всех моих классах, таких как класс C.

Я бы предпочел создать один класс B, который все мои классы C могут просто наследовать.

Моя проблема в том, что я не знаю, как позвонить в класс А из класса В.

Если есть лучший способ сделать это, я открыт для этого.

0

Решение

Ваш код не соответствует вашему описанию (в коде B не наследуется от A, тогда как в вашем описании это соответствует), но я думаю, что вы говорите: «У меня есть большое количество классов, таких как A, и большой количество классов, которые наследуются от таких классов, как A (C в вашем примере), и в этих подклассах есть куча общих вещей, которые я бы хотел выделить (в B в вашем примере), но он включает в себя вещи, которые зависят от конкретного A (вызывая метод A в вашем примере), и это сводит на нет весь смысл делать много B (по одному для каждого A) в основном одинаковыми. «

Одна вещь, которую вы можете использовать, это трюк «шаблонный класс, наследующий от аргумента», чтобы определить большое количество вариантов B как один шаблонный класс:

template<class A> B : public A {
void eventHandler(Event* E) {
call methodToCall();
}
}

class C1 : public B<A1> {
... whatever

class C2 : public B<A2> { ...

Если у вас есть определенные классы A, которым требуется немного другой материал в B, вы также можете специализировать шаблон B для этих классов.

1

Другие решения

Этот код

class A {
void methodToCall() {};
}

Должно быть

class A {
static void methodToCall() {};
}

Чтобы это работало:

 void eventHandler(Event* E) {
A::methodToCall()
}

Потому что у вас нет объекта типа A и «Б» ничего не знает о A — поэтому будут доступны только статические методы.

Или сделать это

class B : public A ....
class C: public B

Тогда статика не требуется, так как B наследует A.

Выбор за вами.

0

Вы можете написать класс-оболочку, который является подклассом A и B. Подкласс, называемый D, будет знать о A и B, поэтому при возникновении события D отвечает за его обработку и вызов A. Затем вы можете ваш класс C просто наследует класс D.

РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял ваш вопрос здесь. Если B наследует A, то B может вызывать функцию в A напрямую (если метод A не является частным. Если бы это было так, вы бы не смогли вызвать его в любом случае).

0