17

我有基类A,B类继承自A,作为模板类的C类继承自A。D类继承自C。关系如下:

        A
       / \   
      B   C (template class)
           \
            D

我可以使用 D 对象 D1 创建一个 A 对象 O1,然后我想将 O1 动态转换为 C 类型对象 C1。但我发现它失败了。我的问题是为什么这个过程会失败?

然后我使用 static_cast 从 D 对象 D1 创建 C 类型对象 C2,并检查 C2 是否具有来自 D2 的正确值。使用static_cast从D类型转换为C类型总是成功吗?

谢谢!!!

4

2 回答 2

16

好吧,既然C是一个模板,它就不是一种类型,不能用作转换的目标(既不是动态的也不是静态的),你不能从它派生。您需要实例化类模板。生成的类可以在强制转换中使用。也就是说,以下将起作用:

struct A { };
template <typename T> struct C : A { };
struct D : C<int> { };

D d;
A& a = d;
C<int>& c = static_cast<C<int>&>(a); // or dynamic_cast, if `A` were polymorphic
于 2012-08-28T16:08:35.293 回答
9

到类型 C 对象 C1。但我发现它失败了。

既然C是模板,就真的没有“C 型”。而是有C<int>or C<Foo>(假设您有一个模板参数)。模板只有在专门化时才成为类。

因此,如果 D 继承自特定类型的 C:

 class D : public C<int>
 {
 };

你可以dynamic_cast达到 aC<int>但不能说 a C<float>

为了帮助更好地解释,你的继承树真的是

         A
       / | \
C<float>... C<int> 
             | 
             D

所以 C 不是 D 的父级,而是C<int>(在本例中)。的实例C在运行时并不真正存在,只有完全指定的实例C<type>实际存在。

于 2012-08-28T16:10:07.667 回答