Я не понял, что Вы не можете назвать Родителя. 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;
}
Это потому, что у вас есть две копии InterfaceA
. См. Это для более подробного объяснения: https://isocpp.org/wiki/faq/multiple-inheritance (ваша ситуация похожа на «ужасный алмаз»).
Вам нужно добавить ключевое слово виртуальный
, когда вы наследуете ClassA от InterfaceA. Вам также необходимо добавить виртуальный
, когда вы наследуете InterfaceB от InterfaceA.
Эта проблема существует, потому что C ++ на самом деле не имеет интерфейсов, а только чистые виртуальные классы с множественным наследованием. Компилятор не знает, где найти реализацию methodA ()
, потому что она реализована другим базовым классом ClassAB
. Вы можете обойти это, реализовав methodA ()
в ClassAB ()
для вызова базовой реализации:
class ClassAB : public ClassA, public InterfaceB
{
void methodA()
{
ClassA::methodA();
}
void methodB();
}
You здесь есть ужасный бриллиант. InterfaceB и ClassA должны фактически унаследовать от InterfaceA В противном случае у вас ClassAB есть две копии MethodA, одна из которых все еще чисто виртуальная. Вы не сможете создать экземпляр этого класса. И даже если бы вы были - компилятор не смог бы решить, какой MethodA вызывать.