Интерфейсное наследование в C++

Я не понял, что Вы не можете назвать Родителя. DesignMode (и я учился, что-то о 'защищенном' в C# также...)

Вот отражающая версия: (Я подозреваю, что могло бы быть преимущество производительности для создания designModeProperty статическое поле)

static bool IsDesignMode(Control control)
{
    PropertyInfo designModeProperty = typeof(Component).
      GetProperty("DesignMode", BindingFlags.Instance | BindingFlags.NonPublic);

    while (designModeProperty != null && control != null)
    {
        if((bool)designModeProperty.GetValue(control, null))
        {
            return true;
        }
        control = control.Parent;
    }
    return false;
}
17
задан Michael Myers 12 November 2009 в 16:32
поделиться

3 ответа

Это потому, что у вас есть две копии InterfaceA . См. Это для более подробного объяснения: https://isocpp.org/wiki/faq/multiple-inheritance (ваша ситуация похожа на «ужасный алмаз»).

Вам нужно добавить ключевое слово виртуальный , когда вы наследуете ClassA от InterfaceA. Вам также необходимо добавить виртуальный , когда вы наследуете InterfaceB от InterfaceA.

22
ответ дан 30 November 2019 в 11:44
поделиться

Эта проблема существует, потому что C ++ на самом деле не имеет интерфейсов, а только чистые виртуальные классы с множественным наследованием. Компилятор не знает, где найти реализацию methodA () , потому что она реализована другим базовым классом ClassAB . Вы можете обойти это, реализовав methodA () в ClassAB () для вызова базовой реализации:

class ClassAB : public ClassA, public InterfaceB
{ 
    void methodA()
    {
        ClassA::methodA();
    }

    void methodB(); 
}
4
ответ дан 30 November 2019 в 11:44
поделиться

You здесь есть ужасный бриллиант. InterfaceB и ClassA должны фактически унаследовать от InterfaceA В противном случае у вас ClassAB есть две копии MethodA, одна из которых все еще чисто виртуальная. Вы не сможете создать экземпляр этого класса. И даже если бы вы были - компилятор не смог бы решить, какой MethodA вызывать.

2
ответ дан 30 November 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: