试图将多态性添加到模板函数中

时间:2013-07-02 21:17:32

标签: c++ templates polymorphism

所以是的,你不能拥有模板虚拟类成员函数。这是有道理的,而不是试图弄清楚那部分...我正在尝试像魔鬼一样避免多重/虚拟继承。

我有一个模板类A,一个继承自A的抽象模板类B和一个继承自B的C。

template <typename T>
class A 
{
protected:
   T val; 
public:
   A(T a) {val = a;}
   T val() {return val();}

   template <typename J>
   A<J> cast_as() { return A<J>((J)val); }
};

template <typename T>
class B : public A<T>
{
protected:
  int b;
public:
   B(T a) : A(a){b=10*a;}
   virtual foo() = 0;
   //and I'd like, but this can't exist
   //template <typename J>
   //B<J>* BCastAs();

};

template <typename T>
class C : public B<T>
{
protected:
  int c;
public:
  C(T c) : B(c) { c=c+1;}
  virtual foo() override { cout << (a+b+c);}
};

int main() { C<int> c(10); B<double>* b = c.BCastAs<double>();}

我想不出任何方法可以做到这一点......感觉它应该是可能的,因为B *不需要实际知道它是C(很像克隆调用的返回)但我不知道如何在没有虚拟模板成员函数的情况下使c正确移动,这是不可能的。

1 个答案:

答案 0 :(得分:0)

您发布的示例代码看起来像是一个严重的设计缺陷,我第一眼看到。

通常没有必要在类模板中使用虚函数,因为您可以使用CRT pattern来避免它们。

你构成了你需要继承类的意图(这就是你创建模板'abstract'的方法),它实现了一个定义的接口。接口可以或(最好)不被定义为纯虚方法(静态接口检查也会这样做,并且在缺少方法实现的情况下会导致不太神秘的编译器错误消息)。

您可以在我的STTCL template library中看到此类模板框架的示例以及如何使用此技术。

简而言之:使用静态多态。

<强>更新
是的,我也在STTCL中使用纯虚方法,但是以完全不同的方式(就像连接完整的继承层次结构的基本入口点一样)。