C++ 如何对模板基类进行子类化?

C++ 如何对模板基类进行子类化?,c++,inheritance,templates,C++,Inheritance,Templates,我有以下数据结构: struct fastEngine { ... } struct slowEngine { ... } template<typename T> class Car { T engine; vector<T> backupEngines; virtual void drive() = 0; } class FastCar : public Car<fastEngine> { virtual void drive

我有以下数据结构:

struct fastEngine { ... }
struct slowEngine { ... }

template<typename T>
class Car {
   T engine;
   vector<T> backupEngines;

   virtual void drive() = 0;
}

class FastCar : public Car<fastEngine> {
   virtual void drive() {
      // use the values of "engine" in some way
   }
}

class SlowCar : public Car<slowEngine> {
   virtual void drive() {
      // use the values of "engine" in some way
   }
}

Car* getCarFromCarFactory() {  // 1
   if (randomNumber == 0)
      return new FastCar();
   else
      return new SlowCar();
}

void main() {
   Car* myCar = getCarFromCarFactory(); // 2
   myCar->drive();
}
struct fastEngine{…}
结构slowEngine{…}
模板
班车{
T型发动机;
矢量备份引擎;
虚拟空驱动器()=0;
}
快车类:公共汽车{
虚拟空驱动器(){
//以某种方式使用“发动机”的值
}
}
慢车类:公共汽车{
虚拟空驱动器(){
//以某种方式使用“发动机”的值
}
}
汽车*getCarFromCarFactory(){//1
如果(随机数==0)
归还新的FastCar();
其他的
返回新的SlowCar();
}
void main(){
Car*myCar=getCarFromCarFactory();//2
myCar->drive();
}

编译器在位置1和2抱怨,因为它要求我使用模板参数定义Car*。我不在乎我使用的汽车的模板版本,我只想要一个指向我可以驾驶的汽车的指针。引擎结构必须是结构,因为它们来自现有代码,我无法控制它们。

您可以创建一个非模板基类,该基类由
Car
继承,例如

struct ICar {
    virtual void drive() = 0;
};

template <typename T>
class Car : public ICar {
    // ...
}

int main() { // BTW, it's always `int main`, not `void main`
    ICar *myCar = getCarFromCarFactory();
    myCar->drive();
}
struct-ICar{
虚拟空驱动器()=0;
};
模板
级别:公共ICar{
// ...
}
int main(){//BTW,它总是'int main',而不是'void main'`
ICar*myCar=getCarFromCarFactory();
myCar->drive();
}

PiotrLegnica的答案是正确的,但我只想补充几点:

类模板不是类 在代码中,Car是一个类模板。类模板不是类,它只是。。。可以从中定义类的模板,同一模板的不同实例化不一定会导致具有相同接口的类型。一个简单的例子:

template<class T>
class Foo
{
public:
  T Bar();
  bool Baz(const T&);
};
模板
福班
{
公众:
T-Bar();
布尔巴兹(康斯特&);
};
结构和类(几乎)是一样的 引擎结构必须是结构 因为它们来自现有代码 我无法控制他们


我假设您写这篇文章是因为您怀疑问题与使用结构而不是类作为模板参数有关。事实并非如此。在C++中,结构和类几乎是一样的。唯一的区别是,默认的访问和继承对于结构是公共的,而对于类是私有的。

强制使用另一个接口很难看,但它可以工作。非常感谢@Brian:接口的全部要点是最小化类的暴露表面积(即封装模板)。由于您似乎不需要知道使用该车的类中的发动机类型,因此隐藏该信息更为清晰。@codetaku这不是“意见”,而是标准所要求的(与其中的return不同,return显式默认为return 0)。@codetaku如果我告诉您
return 0 >主代码< /代码>是可选的,而 int()/<代码>是必需的吗?事实上,
void main
在OP的情况下编译是编译器的一个缺陷。