У меня есть ситуация, похожая на Множественное наследование + беспорядок виртуальных функций . Я тиражировал код в менее сложной среде, чтобы продемонстрировать, о чем я запутался.
Я хочу знать, как C выполняет (но не обрабатывает) и B1 :: method, и B2 :: method, который, в свою очередь, выполняет унаследованные методы.
Единственный способ, которым я могу видеть это как работу (правильно), это то, что родительский класс - это тот, который передает вызов функции подклассам, поэтому он получает доступ к виртуальным таблицам Bx напрямую, а не через C.
В любом случае, это безопасное или неопределенное поведение, какие подводные камни и т. Д .; и что может быть лучший способ сделать это.
#include <iostream>
#include <vector>
class A {
static std::vector<A*> listeners;
public:
static void propagate();
protected:
A() {
listeners.push_back(this);
}
~A() {
for (std::vector<A*>::iterator it = listeners.begin(); it != listeners.end(); ++it) {
if (*it == this) {
listeners.erase(it);
break;
}
}
}
virtual void method()=0;
};
std::vector<A*> A::listeners;
void A::propagate() {
for (unsigned int i=0; i < listeners.size(); ++i) {
listeners[i]->method();
}
}
class B1 : public A {
protected:
B1() {}
~B1() {}
void method() {
B1inhmethod();
}
virtual void B1inhmethod() {}
};
class B2 : public A {
protected:
B2() {}
~B2() {}
void method() {
B2inhmethod();
}
virtual void B2inhmethod() {}
};
class C : public B1, public B2 {
public:
C() {}
~C() {}
void B1inhmethod() {
std::cout << "\nB1method in C";
}
void B2inhmethod() {
std::cout << "\nB2method in C";
}
};
int main() {
C myclass;
A::propagate();
return 0;
}
выход:
B1inhmethod in C
B2inhmethod in C