双重继承型扣减

Double inheritance type deduction

提问人:Frank 提问时间:8/9/2023 最后编辑:DailyLearnerFrank 更新时间:8/9/2023 访问量:63

问:

我有以下模板类:

template<class T>
class Foo {
  public:
    void Bar(T* t) { member = t; }
  private:
    T* member;
};

这被(两次)用作不同类的基类:

class AwesomeClass : public Foo<ISomeInterface>, public Foo<IOtherInterface> {};

然后称为这样的东西:

class Caller {
  void Init(ISomeInterface * i) {
    AwesomeClass a;
    a.Bar(i);
   }
}

但是,这不会编译,说明对 Bar 的调用是模棱两可的。因此,我需要使用 ,因为显然编译器无法确定要调用哪个 Bar(甚至认为它被赋予了一个 ISomeInterface 对象)。有什么办法可以解决这个问题吗?a.Foo<ISomeInterface>::Bar(i)

另外,我想知道继承是否是这里的“正确”方法,或者组合是否是一个更好的选择。

C++ 模板 继承

评论

1赞 freakish 8/9/2023
当然,这是基于意见的,但在我看来,你应该坚持作文。使用继承的唯一原因是当您想要实现功能时,即实现接口。但这里似乎并非如此。
1赞 Dai 8/9/2023
@freakish 继承需要死亡:boxbase.org/entries/2020/aug/3/case-against-oop
0赞 Pepijn Kramer 8/9/2023
@Dai使该类继承...接口(抽象基类)继承对于依赖注入/单元测试(这些接口的实现应该通过聚合来完成)多态性仍然有用)。是的,从理论上讲,这也可以在C++中用概念和静态多态性来完成(而不是接口,而是需要一组接口方法签名的概念)。

答:

4赞 songyuanyao 8/9/2023 #1

您可以将 s 引入 ,然后两者都可以在重载解决的范围内找到。F.D.公司BarAwesomeClassAwesomeClass

class AwesomeClass : public Foo<ISomeInterface>, public Foo<IOtherInterface> {
public:
    using Foo<ISomeInterface>::Bar;
    using Foo<IOtherInterface>::Bar;
};

评论

0赞 Frank 8/10/2023
这似乎有效,但我想知道为什么有必要。有没有这个就不能工作的好理由吗?我没有看到编译器有什么额外的信息。
1赞 HolyBlackCat 8/9/2023 #2

您需要好友函数和 ADL。这样,您就不需要从每个基地单独使用每个这样的方法。using

template <typename T>
class Foo
{
    T *member = nullptr;
    
  public:
    friend void Bar(Foo &self, T *t)
    {
        self.member = t;
    }
};
void Init(ISomeInterface * i)
{
    AwesomeClass a;
    Bar(a, i);
}