正在尝试将多态性添加到模板函数中

Trying to add polymorphism to template function

本文关键字:函数 添加 多态性      更新时间:2023-10-16

所以,是的,你不能有一个模板虚拟类成员函数。这是有道理的,不要试图弄清楚那部分。。。我拼命避免多重/虚拟继承。

我有一个模板类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正确移动的方法,这是不可能的。

乍一看,您发布的示例代码似乎有一个严重的设计缺陷。

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

您提出了需要继承类的意图(这就是您制作模板"抽象"的方式),这些类实现了定义的接口。接口可以被定义为或(优选地)不被定义为纯虚拟方法(静态接口检查也可以,并且在缺少方法实现的情况下会导致不那么神秘的编译器错误消息)。

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

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

更新:
是的,我还在STTCL中使用纯虚拟方法,但方式完全不同(就像耦合完整继承层次结构的基本入口点一样)。