Что ж, если к специальным и нормальным окружностям можно приложить как силы, так и к специальному кругу есть другой метод, который применяет специальные силы, почему бы не иметь два интерфейса и два метода?
struct Applicable {
virtual ~Applicable() { }
// if it applies force, better be explicit with naming it.
virtual void applyForce() = 0;
};
struct SpecialApplicable {
virtual ~SpecialApplicable() { }
virtual void applySpecialForce() = 0;
};
struct Shape {
virtual ~Shape() { }
Size getSize();
Point getPosition();
// ...
};
struct Circle : Shape, Applicable {
virtual void applyForce() { /* ... */ }
}
struct SpecialCircle : Circle, SpecialApplicable {
virtual void applySpecialForce() { /* .... */ }
};
Если не имеет смысла, если есть как специальный, так и обычный метод применения (который предлагает название класса - SpecialCircle
-), то почему бы не сделать даже это:
struct Circle : Shape, Applicable {
virtual void applyForce() { /* ... */ }
}
struct SpecialCircle : Circle {
// applies force, but specially
virtual void applyForce() { /* .... */ }
};
Вы также можете поместить applyForce
в класс Shape. Это также зависит от среды, в которой эти классы используются. В любом случае, вам действительно следует избегать использования одного и того же метода в двух базовых классах, которые появляются в двух разных базовых решетках. Потому что это неизбежно приведет к таким проблемам неоднозначности. Наследование diamond - это когда вы используете виртуальное наследование. Я полагаю, что есть другие хорошие ответы на stackoverflow, объясняющие это. Это не применимо к вашей проблеме, потому что неоднозначность возникает из-за того, что метод появляется в двух объектах базового класса разных типов. (Он решает только те случаи, когда базовые классы имеют один и тот же тип. В этих случаях он объединит базовые классы и будет содержать только один подобъект базового класса - унаследованный виртуальным наследованием)