Is it possible to use covariance alongside virtual inheritance?
Here is a simplified scenario.
class A{};
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
class CoreA
{
protected:
virtual A& Get() = 0;
};
class CoreB : public virtual CoreA {
virtual B& Get() = 0;
};
class CoreC : public virtual CoreA {
virtual C& Get() = 0;
};
class CoreD : public CoreB, public CoreC
{
public:
virtual D& Get() override { return d; }
protected:
D d;
};
I am running into an ambiguity problem due to both CoreB's and CoreC's Get functions. If they are removed, there are no more errors, but I need those Get functions.
I have been able to resolve the issue by renaming the Get functions inside of CoreB and CoreC, while overriding them in CoreD
class CoreB : public virtual CoreA {
virtual B& Get_B() = 0;
};
class CoreC : public virtual CoreA {
virtual C& Get_C() = 0;
};
class CoreD : public CoreB, public CoreC
{
public:
virtual D& Get_B() override { return d; }
virtual D& Get_C() override { return d; }
virtual D& Get() override { return d; }
protected:
D d;
};
Does anyone know of a cleaner workaround?