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)
到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>实际存在的实例指定.