从具有多重继承的派生 class 调用所有基 classes 的通用命名方法

Call a common named method of all base classes from a derived class with multiple inheritance

我意识到我正在尝试做的事情可能是错误的,所以我很乐意接受替代方法。 以下所有代码仅供参考。

假设我有一个派生的 class,具有多个基数 classes:

template<typename... Bases> class Derived : public Bases...{
public:
    VariadicTemplate(BaseClasses&&... base_classes) : BaseClasses(base_classes)... {}

    void DoAllFoo();
};

并且所有基础 classes 都有一个名为 DoFoo() 的方法。我打算使用 public 方法 Foo():

从公共基础派生它们
class CommonBase {
public:
    virtual Foo() { DoFoo() };
protected:
    virtual void DoFoo() = 0;
};

class Base1 : public CommonBase {
    DoFoo() { /* displays something */ };
};

class Base2 : public CommonBase {
    DoFoo() { /* displays something else */ };
};

....

现在这就是我要使用它的方式。我想实例化一些 Derived class 对象,用不同的 Base classes:

指定
Devired<Base1, Base2> x;
Devired<Base5, Base7, Base21> y;
...
x.DoAllFoo();
y.DoAllFoo();

我希望(以某种方式)Derived 的 DoAllFoo() "iterate" 超过它的 Base classes 并调用每个 classes Foo() 方法。

我能想到的唯一解决方案是在 Derived 中有一些函数集 pointers/functors/whatever 并让所有的 Bases 在构造时在这个集中注册他们的 Foo() 方法。这可能会奏效,但看起来可以做得更好。

我希望,我不熟悉解决这个问题的一些通用模式(或者我完全错了),所以请指教。 谢谢。

我将使用的模式只是组合而不是继承。为什么不直接将基 类 的对象作为现在称为 Derived 的对象的成员?您可以简单地将它们存储到 std::vector 中,然后在 DoAllFoo.

中对其进行迭代

例如:

class FooWrapper {

// ...

public:
  void DoAllFoos();

private:
  std::vector<std::unique_ptr<CommonBase> > bases_;   


} 

void FooWrapper::DoAllFoos() 
{
   for(auto& base: bases)
     base->DoFoo();
}

你想要:

void DoAllFoo()
{
    using expand = int[];
    static_cast<void>(expand{ 0, (static_cast<Bases*>(this)->Foo(), void(), 0)... });
}

或:

void DoAllFoo()
{
    using expand = int[];
    static_cast<void>(expand{ 0, (Bases::Foo(), void(), 0)... });
}

取决于对 Foo 本身的调用是否应该是虚拟的。