Multiple inheritance + virtual function mess과 비슷한 상황이 있습니다. 덜 복잡한 환경에서 코드를 복제하여 혼란 스러움을 보여줍니다.다중 상속 및 중복 함수 호출
어떻게 C가 B1 :: 메서드와 B2 :: 메서드를 실행 (하지만 처리하지 않음)했는지 알고 싶습니다.이 메서드는 차례로 상속 된 메서드를 실행합니다.
내가 제대로 작동하는 것으로 볼 수있는 유일한 방법은 부모 클래스가 하위 클래스에 함수 호출을 전파하는 것이므로 C가 아닌 Bx의 vtable에 직접 액세스하기 때문입니다.
두 경우 모두 안전하거나 정의되지 않은 동작, 어떤 함정 등이 있습니까? 그리고 아마도 이것을하는 더 좋은 방법 일 것입니다.
#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
위의 코드는 출력을 생성하지 않습니다. –
코드를 수정했는데 함수 이름에 오타가있었습니다 – dcousens