我有这样的类层次结构:我可以将CRTP与多个派生类一起使用,并以多态方式使用它们吗?
template <class Type>
class CrtpBase
{
protected:
Type& real_this()
{
return static_cast<Type&>(*this);
}
};
template <class ChildType>
class Base : CrtpBase<ChildType>
{
public:
void foo()
{
this->real_this().boo();
}
};
class Derived1 : public Base<Derived1>
{
public:
void boo { ... }
};
class Derived2 : public Base<Derived2>
{
public:
void boo { ... }
};
的事情是,我想用我的课以这样的方式
std::vector<Base*> base_vec;
base_vec.push_bach(new Derived1());
base_vec.push_bach(new Derived2());
.........
base_vec[0]->foo();
但是,这是不可能的,因为所有派生基类类是不同的(实际上Base不是一个类型,它是模板)。那么,有没有办法使用crtp与多个派生类,以及多态?
我用过crtp的所有东西都是为了避免虚函数,那么这个解决方案的含义是什么?引入crtp类来避免虚函数,然后使用具有虚函数的抽象类来解决这个问题?废话 – user1289
@ user1289那么,CRTP是一个编译时解决方案,这意味着你有基于不同类型的编译时调度。然后你要求具有相同的类型,这意味着运行时调度和虚拟功能。请注意,'boo()'仍然是静态调度的。 – Angew
@Angew,没有crtp也只会需要一个运行时调度,在这种情况下,我有一个运行时和一个静态,可能比没有使用crtp更差。我的问题可能没有解决办法,只是想检查一下是否存在黑客攻击。 – user1289