나는 이보다 훨씬 복잡한 클래스 구조를 가지고 있지만 본질적으로 문제를 끓여 내 시나리오를 설명합니다. 순수한 가상 기본 클래스를 구현하는 두 클래스 인 A & B가 있습니다. 공유하는 다음 공통 조상, 그리고 마지막으로 & B를 할 수있는 COM-단정 세 번째 클래스 C, 순수 가상 기본의 일반적인 방법 채워 템플릿 클래스 :추상 기본 클래스의 모호한 상속 :
struct I {
virtual void r()=0;
};
struct A : I {};
struct B : I {};
struct C : A, B {
void q(){
r(); // the problem is here.
}
};
struct D : C {
virtual void r(){
}
};
C* c = new D;
c->q();
내 문제는, 내가 할 수있는 것입니다 r()를 호출하기 위해 C :: q를 얻는 방법을 알지 못한다.
void C::q(){
r(); // is ambiguous
A::r(); // is pure virtual
B::r(); // also is pure virtual
D::r(); // C doesn't know about D
((D*)this)->r(); // is dubious and requires C to know about D.
}
올바른 가상 메서드가 호출되도록 C에서 r() 메서드를 호출하려면 어떻게해야합니까?
죄송합니다. 여기서 가상 계승을 사용할 수 없음을 분명히해야합니다. 모두가 모든 것을 해결하기 위해 충분히() R에 대한 호출을 명확하게 나타납니다
struct C : A, B {
virtual void r()=0;
...
또는
struct C : A, B {
using A::r;
...
: 나는 두 가지 해결책을 발견했다.
는 C에서
+1 귀하의 문제를 해결하고 가장 단순한 형태로 분해하십시오. –
r()이 가상 상속없이 C에서 모호하지 않습니까? – DumbCoder
가상 기본 클래스 또는 추상 기본 클래스를 의미합니까?'I' 가상베이스를 만들기 위해서는'struct A : virtual I {};과'struct B : virtual I {}; '이 필요합니다. –