如何子类化模板化的基类?

时间:2009-09-25 20:47:04

标签: 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() {
      // 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();
}

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

2 个答案:

答案 0 :(得分:16)

您可以创建Car<T>继承的非模板化基类,例如

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();
}

答案 1 :(得分:4)

PiotrLegnica的答案是对的,但我想补充几点:

类模板不是类

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

template<class T>
class Foo
{
public:
  T Bar();
  bool Baz(const T&);
};

struct和class(几乎)是同一个东西

  

发动机结构必须是结构   因为它们来自现有代码   而且我无法控制它们。

我认为你写这篇是因为你怀疑这个问题与使用结构而不是类作为模板参数有关。不是这种情况。在C ++中,struct和class几乎是一回事。唯一的区别是默认访问和继承是公共的结构,而它们是私有的类。