Алмазный код наследования в C ++ не работает должным образом

Я пытаюсь понять решение проблемы алмаза (множественное наследование) в 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: «Печать»: идентификатор не найден

Может кто-нибудь сказать мне, что мне здесь не хватает?

1

Решение

Какая версия 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,

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector