从具有多重继承的派生类中调用所有基类的公共命名方法

时间:2016-03-19 11:16:59

标签: c++ c++11 inheritance design-patterns variadic-templates

我意识到我想要做的事情可能是错的,所以我很乐意接受和替代方法。 以下所有代码只是一个例子。

假设我有一个派生类,有多个基类:

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

    void DoAllFoo();
};

所有基类都有一个名为DoFoo()的方法。我将使用公共方法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 */ };
};

....

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

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

我想(以某种方式)Derived的DoAllFoo()到#34;迭代&#34;在它的基类上调用每个类Foo()方法。

我能想象的唯一解决方案是在Derived中有一些函数指针/仿函数/任何东西,并且在构造时让所有Bases在这个集合中注册它们的Foo()方法。这可能会奏效,但看起来可以做得更好。

我希望,我不熟悉解决这个问题的一些常见模式(或者我只是纯粹的错误),所以请指教。 谢谢。

2 个答案:

答案 0 :(得分:3)

你想要:

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本身的调用是否应该是虚拟的。

答案 1 :(得分:1)

我将使用的模式只是组合而不是继承。为什么不将基类的对象作为您现在称为SELECT ah type , MAX(CASE WHEN av = 'A' THEN score END) 'A' , MAX(CASE WHEN av = 'B' THEN score END) 'B' FROM my_table GROUP BY ah; +------+------+------+ | type | A | B | +------+------+------+ | A | 1.00 | 2.00 | | B | 0.50 | 0.14 | +------+------+------+ 的成员?您只需将它们存储到Derived中,然后在std::vector内迭代它。

例如:

DoAllFoo