我意识到我想做的事情可能是错误的,所以我很乐意接受替代方法。 下面的所有代码只是一个示例。
假设我有一个派生类,具有多个基类:
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/