Я пытаюсь понять решение проблемы алмаза (множественное наследование) в C ++.
Я написал этот код, чтобы лучше понять решение, но оно не работает так, как ожидалось.
#include <stdio.h>
class A
{
public:
void Print()
{
printf("A\n");
}
};
class B : virtual public A
{
public:
void Print()
{
printf("B\n");
}
};
class C : virtual public A
{
public:
void Print()
{
printf("C\n");
}
};
class D : public B, public C
{
};
int main()
{
D d;
d.Print();
}
Экспресс-издание Visual Studio 2008 кричит:
ошибка C2385: неоднозначный доступ к «Print»
1> может быть «Печать» в базе «B»
1> или может быть «Печать» в базе «С»
ошибка C3861: «Печать»: идентификатор не найден
Может кто-нибудь сказать мне, что мне здесь не хватает?
Какая версия Print()
должен d.Print()
вызов? Есть два варианта. Вы можете выбрать, хотя:
d.A::Print(); // this one isn't part of the overload set search without qualification
d.B::Print();
d.C::Print();
Обратите внимание, что делает A::Print()
virtual
функция не поможет, так как не существует уникальной конечной функции переопределения. Вы должны явно переопределить Print()
в D
,
Других решений пока нет …