c++ - 从具有多重继承的派生类调用所有基类的公共(public)命名方法

标签 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() 的方法。我打算使用公共(public)方法 Foo() 从公共(public)基础派生它们:

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 */ };
};

....

现在这就是我要使用它的方式。我想实例化一定数量的派生类对象,并使用不同的基类指定:

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

我希望(以某种方式)派生类的 DoAllFoo() “迭代”它的基类并调用每个类的 Foo() 方法。

我能想到的唯一解决方案是在 Derived 中拥有一些函数指针/仿函数/其他内容,并让所有 Base 在构造时在该集中注册其 Foo() 方法。这可能会起作用,但看起来还可以做得更好。

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

最佳答案

您想要:

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

关于c++ - 从具有多重继承的派生类调用所有基类的公共(public)命名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36101016/

相关文章:

c++ - 游戏内 UI 的设计模式

c++ - 获取错误 : redifinition of bool queue<T> previously declared here

c++ - 虚拟表和继承 C++

c++ - 在boost中为动态数组定义自定义步进器

c++ - C/C++ 中双引号字符的备用字符组合是什么?

c++ - 实现可变最小值/最大值函数

C++11 表达式中的变量类型?

c++ - 继承和 friend : Safety mechanism?

java - 使用已检查的异常重写方法

c++ - 无法运行在 Qt Creator 中创建的程序?