1

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

我有一个模板类 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 在没有虚拟模板成员函数的情况下正确移动,这是不可能的。

4

1 回答 1

1

乍一看,您发布的示例代码对我来说似乎存在严重的设计缺陷。

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

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

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

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

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

于 2013-07-02T22:48:27.197 回答