Covariance and virtual inheritance causing ambiguity

Viewed 73

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?

1 Answers

Reported Issue to Microsoft under Developer Community

Unfortunately, this is a limitation in MSVC’s object model and requires ABI breaking changes to support. You can consider writing your own covariant wrapper to work around.

Related