Ключевое слово final
в объявлении виртуального метода предотвращает множественное наследование, поэтому, если я попытался устранить неоднозначность в этом случае, это неправильный подход.Если и у Box, и у Sphere будет последнее слово, вы получите ошибку «виртуальная функция Shape :: print имеет более одного окончательного переопределения в GeoDisc».Правовое решение двусмысленности будет:
struct Sphere : public virtual Shape
{
void print() override
{
std::cout << "SPHERE" << std::endl;
}
};
struct GeoDisc : public Box, public Sphere
{
void print() final override
{
Sphere::print();
}
};