C++ Решение проблемы с алмазом
Не может ли проблема алмазов быть решена с помощью первой найденной унаследованной декларации? Я имею в виду,
открытый класс A { публичный виртуальный int getInt(); }; публичный класс B: публичный A { public int getInt() {return 6;} }; публичный класс C: публичный A { public int getInt() {return 7;} }; открытый класс D: открытый B, открытый C {};
за class D
, поскольку B
указан первым, не могли бы мы просто по умолчанию (если это неоднозначно) использовать B::getInt()
если D::getInt()
называется? Как работает переменная окружения PATH в UNIX и других ОС; если две вещи существуют с одним и тем же именем в разных местах в переменной PATH, то первое местоположение должно использоваться по умолчанию (если не указано иное).
Редактировать: под 'первым' найденным унаследованным объявлением я подразумеваю согласно простому порядку слева направо
Редактирование #2: только что обновленная выше реализация была более похожа на бриллиант.
2 ответа
Это очень ошибочное решение. Подумайте, что произойдет в следующем случае:
public class A {
public int getInt() {return 5;}
public float getFloat() {return 5.0;}
};
public class B {
public int getInt() {return 6;}
public float getFloat() {return 6.0;}
};
public class C {
public int getInt() {return 7;}
public float getFloat() {return 7.0;}
};
public class D: public A, public B, public C {}
Предположим, что кто-то захочет D::getInt
вернуть 5, пока другой разработчик хочет D::getFloat
вернуть 7.0 (таким образом, разные функции разрешены для разных предков). Второй разработчик изменит порядок наследования, и ошибка будет ползти во всех путях кода в зависимости от getInt
,
Это не проблема бриллиантов. Компилятор C++ специфичен в отношении всего его синтаксиса, и если есть какая-либо неоднозначность, он всегда выдаст ошибку.
Здесь твой A::getInt()
, B::getInt()
а также C::getInt()
двусмысленны, когда вы просто звоните d.getInt()
,
Редактировать:
В вашем отредактированном вопросе все еще компилятор не оценивает по наследству, потому что некоторым программистам действительно могут понадобиться разные копии A
==> 1-й через class B
и 2-й через class C
, Обратите внимание, что так называемая проблема с алмазами - это проблема, характерная для людей. Для компилятора C++ это просто еще один шаблон.
В философии C++ вы не ограничены только одной парадигмой или шаблоном. Вы можете выбрать множественное наследование по вашему выбору.