从具有多重继承的派生 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
本身的调用是否应该是虚拟的。
我意识到我正在尝试做的事情可能是错误的,所以我很乐意接受替代方法。 以下所有代码仅供参考。
假设我有一个派生的 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
本身的调用是否应该是虚拟的。