gpt4 book ai didi

c++ - 在容器中存储多重继承对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:30 25 4
gpt4 key购买 nike

我使用的库有很多类型,所有类型都派生自相同的 2 个接口(interface):

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

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

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

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

我在这里有哪些选择?我能想到

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

但这两个选项都没有特别的吸引力。有什么想法吗?

two interfaces, multiple inheritance combine into one container?是一个相关的问题,但 James Kanze 的回答对我不起作用,因为我无法更改 3 个类。

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

编辑:现在使用 dynamic_cast 而不是 static_cast(这是行不通的)。

编辑:我发现 Mike Seymour 和 Matthieu M 的回答都很有希望。一旦我把它全部编码,我会接受他们的答案之一。谢谢!

最佳答案

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

struct CartoonDuckWrapper {
IDuck * duck;
ICartoonCharacter * toon;

template <class CartoonDuck>
CartoonDuckWrapper(CartoonDuck & cd) : duck(&cd), toon(&cd) {}
};

没有特别需要使用 static_assert 来检查 CartoonDuck 是否继承自两个基类,尽管这可能比简单地让指针转换失败提供更好的诊断。

如果基类是多态的(它们可能是接口(interface)),您可以通过使用 dynamic_cast 转换来节省一个指针的空间,以换取运行时成本一个到另一个。 static_cast 不能用于基类之间的这种“交叉转换”。

关于c++ - 在容器中存储多重继承对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20562708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com