C ++ Решение проблемы с алмазом - PullRequest
2 голосов
/ 15 июля 2011

Не может ли проблема алмазов быть решена с помощью первого найденного унаследованного объявления?Я имею в виду,

public class A {
    public virtual int getInt();
};

public class B : public A {
    public int getInt() {return 6;}
};

public class C : public A {
    public int getInt() {return 7;}
};

public class D: public B, public C {};

для class D, так как B указан первым, не могли бы мы просто по по умолчанию (когда это неоднозначно) использовать B::getInt(), если D::getInt() называется?Как работает переменная окружения PATH в UNIX и других ОС;если две вещи существуют с одним и тем же именем в разных местах в переменной PATH, то первое местоположение должно использоваться по умолчанию (если не указано иное).

Редактировать: под 'первым' найдено наследуемое объявление, я имею в виду простой порядок глубины слева направо

Редактировать # 2: Просто обновил вышеупомянутую реализацию, чтобы она была более похожа на ромб.

Ответы [ 2 ]

4 голосов
/ 15 июля 2011

Это очень ошибочное решение.Подумайте, что произойдет в следующем случае:

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.

0 голосов
/ 15 июля 2011

Это , а не проблема с алмазом. Компилятор C ++ специфичен для всего его синтаксиса, и если есть какая-то двусмысленность, он всегда выдаст ошибку.

Здесь ваши A::getInt(), B::getInt() и C::getInt() неоднозначны, когда вы просто звоните d.getInt().

Редактировать

В вашем отредактированном вопросе все еще компилятор не оценивает по наследованию, потому что некоторым программистам действительно могут понадобиться разные копии A ==> 1-го через class B и 2-го через class C. Обратите внимание, что так называемая проблема алмаз является проблемой, характерной для человека. Для компилятора C ++ это просто еще один шаблон.

В философии C ++ вы не ограничены только одной парадигмой или шаблоном. Вы можете выбрать множественное наследование по вашему выбору.

...