Ниже приведен упрощенный код, демонстрирующий мою идею.
#include <iostream>
struct base {
virtual int test(){return 0;}
};
struct derived : public base {
virtual int test(){return 1;}
};
template <typename T>
struct foo : public T {
virtual int bar() { return 2;}
};
typedef foo<base> foo_base;
typedef foo<derived> foo_derived;
int main(int argc, char ** argv) {
base * p = new derived(); //It is OK.
std::cout<<p->test()<<std::endl;
foo_base * foo_p = new foo_derived(); //It is not OK
std::cout<<foo_p->bar()<<std::endl;
foo_base * foo_p2 =(foo_base *)(new foo_derived()); //It is working
std::cout<<foo_p2->bar()<<std::endl;
delete foo_p2;
delete foo_p;
delete p;
return 0;
}
Я знаю, что это не нормально из-за того, что шаблон изменяет наследование классов. Есть ли элегантный способ сохранить наследство после применения шаблона?
В частности, возможно ли построить наследование между foo<base>
и foo<derived>
, например, с помощью некоторых шаблонов прокси или специального шаблона, например CRTP, для восстановления того же наследства после создания экземпляра шаблона?