您可以通过多种方式做到这一点,如果您希望派生类自然地使用基类,您可以尝试使用模板模板。
假设你有相同的基类,那么派生类应该是这样的:
template< class T, template<typename> class Base >
struct Derived : Base<T>
{
typename Base<T>::type field;
int f()
{
return n;
}
int f(int x)
{
return Base<T>::f(x);
}
};
但是要实例化 Derived 类,您还需要指定 Base 类。
这样
Derived<int, Base> object;
现在假设您不想这样做,您只想从 SAME 基类实例化 Derived 对象,那么您必须专门化派生模板。 p>
template< class T, template<typename> class Base = Base >
struct Derived : Base<T>
{
Base<T>::type field;
int f()
{
return n;
}
int f(int x)
{
return Base<T>::f(x);
}
};
这样你现在可以创建Derived<int> 或Derived<string>
喜欢这个
int main()
{
Derived<int> bs1;
bs1.field = 200;
std::cout << bs1.f() << std::endl;
std::cout << bs1.f(50)<< std::endl;
std::cout << bs1.field<< std::endl;
Derived<std::string> bs2;
bs2.field = "example";
std::cout << bs2.f() << std::endl;
std::cout << bs2.f(50)<< std::endl;
std::cout << bs2.field<< std::endl;
return 0;
}
什么时候应该这样做?
当您出于某种原因打算切换基类时,可能是针对测试用例。更改基类也可以更改上下文。
您还可以创建一个模板 typedef,它允许您将基本属性带入您自己的派生类。这是一个很好的方法。