所以是的,你不能拥有模板虚拟类成员函数。这是有道理的,而不是试图弄清楚那部分...我正在尝试像魔鬼一样避免多重/虚拟继承。
我有一个模板类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正确移动,这是不可能的。
答案 0 :(得分:0)
您发布的示例代码看起来像是一个严重的设计缺陷,我第一眼看到。
通常没有必要在类模板中使用虚函数,因为您可以使用CRT pattern来避免它们。
你构成了你需要继承类的意图(这就是你创建模板'abstract'的方法),它实现了一个定义的接口。接口可以或(最好)不被定义为纯虚方法(静态接口检查也会这样做,并且在缺少方法实现的情况下会导致不太神秘的编译器错误消息)。
您可以在我的STTCL template library中看到此类模板框架的示例以及如何使用此技术。
简而言之:使用静态多态。
<强>更新强>
是的,我也在STTCL中使用纯虚方法,但是以完全不同的方式(就像连接完整的继承层次结构的基本入口点一样)。