在容器中存储多继承对象

Amb*_*nan 4 c++ oop

我使用的库有很多类型,所有类型都来自相同的2个接口:

class Huey : public IDuck, public ICartoonCharacter
{
...
};

class Dewey : public IDuck, public ICartoonCharacter
{
...
};

class Louie : public IDuck, public ICartoonCharacter
{
...
};
Run Code Online (Sandbox Code Playgroud)

我想将所有上述类型的对象存储在包装类中,并将该包装类的对象粘贴到容器中.当然,我应该能够从我的包装类中调用属于这两个接口的方法.

我有什么选择?我能想到

  • IDuck *s 存储在我的包装器中,并将dynamic_cast-ing存储到ICartoonCharacter,或
  • 使用类似的东西,boost::any同时使我的包装器成为一个类模板,用几个static_asserts来确保模板参数继承自IDuckICartoonCharacter.

但两种选择都没有特别吸引人.有任何想法吗?

两个接口,多个继承组合成一个容器?是一个相关的问题,但詹姆斯坎泽的答案对我不起作用,因为我不能改变3个班级.

编辑:不要经常使用多重继承,忘记了语法.现在public从两个接口继承.

编辑:现在使用dynamic_cast而不是static_cast(这将无法工作).

编辑:我发现Mike Seymour和Matthieu M的答案都很有希望.一旦我编码完毕,我会接受他们的一个答案.谢谢!

Mik*_*our 5

一个简单的选择是在包装器中存储两个指针:

struct CartoonDuckWrapper {
    IDuck * duck;
    ICartoonCharacter * toon;

    template <class CartoonDuck>
    CartoonDuckWrapper(CartoonDuck & cd) : duck(&cd), toon(&cd) {}
};
Run Code Online (Sandbox Code Playgroud)

没有特别需要用来static_assert检查CartoonDuck从两个基类继承的内容,尽管这可能比仅让指针转换失败提供更好的诊断.

如果基类是多态的(可能是接口,它们可能是接口),则可以通过使用dynamic_cast将一个指针转换为另一个指针来节省一个指针的空间,以换取运行时成本.static_cast不能用于基类之间的这种"交叉投射".