所以是的,你不能有一个模板虚拟类成员函数。这是有道理的,而不是试图弄清楚那部分......我像魔鬼一样试图避免多重/虚拟继承。
我有一个模板类 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 在没有虚拟模板成员函数的情况下正确移动,这是不可能的。