关于使用模板类的C++动态转换

Wil*_*iam 16 c++ templates casting dynamic

我有基类A,类B继承自A,类C是模板类,继承自A. class D继承自C.关系如下:

        A
       / \   
      B   C (template class)
           \
            D
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!!!

Kon*_*lph 15

好吧,因为它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
Run Code Online (Sandbox Code Playgroud)


Dou*_* T. 9

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

既然C是模板,那么就没有"C型".相反,有C<int>C<Foo>.(假设你有一个模板arg).模板只有在专业化时才会成为类.

所以如果D继承自特定类型的C:

 class D : public C<int>
 {
 };
Run Code Online (Sandbox Code Playgroud)

你可以动态播放一个C<int>但不是说aC<float>

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

         A
       / | \
C<float>... C<int> 
             | 
             D
Run Code Online (Sandbox Code Playgroud)

所以C不是D的父级,而是C<int>在这个例子中.C它本身的实例在运行时中并不存在任何实例,它的唯一实例完全由C<type>实际存在的实例指定.

  • 不只是运行时-C不是类型,句点。 (2认同)