У меня есть класс С++ с несколькими родителями; каждый родитель определяет функцию с общим именем, но другой целью:
class BaseA
{
virtual void myFunc(); // does some task
};
class BaseB
{
virtual void myFunc(); // does some other task
};
class Derived : public BaseA, public BaseB;
Если бы это было так, у меня не было бы проблем — я мог бы устранить двусмысленность с помощью оператора using и мог бы выбрать, какой из них вызывать, используя имена базовых классов и оператор разрешения области видимости.
К сожалению, производный класс должен переопределить их обоих:
class Derived : public BaseA, public BaseB
{
virtual void BaseA::myFunc(); // Derived needs to change the way both tasks are done
virtual void BaseB::myFunc();
}
Это не работает не потому, что вносит новую двусмысленность (хотя и может), а потому, что
ошибка C3240: «myFunc»: должна быть неперегруженной абстрактной функцией-членом «BaseA»
ошибка C2838: недопустимое полное имя в объявлении члена
При других обстоятельствах я мог бы просто переименовать методы или сделать их чисто виртуальными, как предлагает компилятор. Однако структура иерархии классов и ряд внешних проблем делают первый вариант чрезвычайно трудным, а второй невозможным.
У кого-нибудь есть предложение? Почему квалификаторы разрешены только для чисто виртуальных методов? Есть ли способ одновременно переопределить виртуальные методы и разрешить неоднозначности?
DerivedA : public BaseA
,DerivedB : public BaseB
, а затемDerived : public DerivedA, public DerivedB
. Однако это не решает проблему неоднозначности - person Cameron   schedule 30.03.2011