Описание слова (код ниже): у меня есть библиотека, содержащая набор классов. Для каждой группы классов у нас есть два конкретных типа (ClassA_Partial
, ClassA
), (ClassB_Partial
, ClassB
) и т. д. Каждый из этих реализует (Interface_Partial
, Interface
) соответственно. Кроме того, Interface
является Interface_Partial
, а каждый Class?
является Class?_Partial
, создавая ромбовидный шаблон наследования, в котором вершина наследуется виртуально.
Почему функции Interface_Partial
неоднозначны при наследовании как ClassA
, так и ClassB
?
struct Interface_Partial
{
virtual ~Interface_Partial();
virtual void f() = 0;
};
struct Interface
:
virtual Interface_Partial
{
virtual void g() = 0;
};
struct ClassA_Partial : public virtual Interface_Partial
{
void f() {};
};
struct ClassA : public Interface, public virtual ClassA_Partial
{
void g() {};
};
struct ClassB_Partial : public virtual Interface_Partial
{
void f() {};
};
struct ClassB : public Interface, public virtual ClassB_Partial
{
void g() {};
};
struct MyClass : public ClassA, public ClassB
{ }; // error C2250: MyClass : ambiguous inheritance of 'void Interface_Partial::f(void)'
Почему мы не можем устранить неоднозначность, как обычно, когда наследуем общий интерфейс более одного раза? Например
struct ClassX : public Interface_Partial { void f() {} };
struct ClassY : public Interface_Partial { void f() {} };
class Another : public ClassX, public ClassY
{};
void func()
{
// This is ok
Another a;
a.ClassX::f();
// Why would this not work?
// unambiguously refers to the one and only f() function
// inherited via ClassA
MyClass b;
b.ClassA::f();
}