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 могут просто наследовать.
Моя проблема в том, что я не знаю, как позвонить в класс А из класса В.
Если есть лучший способ сделать это, я открыт для этого.
Ваш код не соответствует вашему описанию (в коде 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 для этих классов.
Этот код
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.
Выбор за вами.
Вы можете написать класс-оболочку, который является подклассом A и B. Подкласс, называемый D, будет знать о A и B, поэтому при возникновении события D отвечает за его обработку и вызов A. Затем вы можете ваш класс C просто наследует класс D.
РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял ваш вопрос здесь. Если B наследует A, то B может вызывать функцию в A напрямую (если метод A не является частным. Если бы это было так, вы бы не смогли вызвать его в любом случае).