我有這樣的類層次結構:我可以將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