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++ вы не ограничены только одной парадигмой или шаблоном. Вы можете выбрать множественное наследование по вашему выбору.

Другие вопросы по тегам