【问题标题】:about the C++ dynamic cast with template class关于模板类的 C++ 动态转换
【发布时间】:2012-08-23 04:42:32
【问题描述】:

我有基类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类型总是成功吗?

谢谢!!!

【问题讨论】:

  • 发布完整代码以及预期和实际结果。有无数的事情可能会出错,如果没有特定的代码,我们无法判断是哪一个。
  • 你的基类有虚函数吗?如果没有,则不能使用dynamic_cast
  • 请记住,大多数这些转换仅对指针和引用有效,对对象本身无效。从您的描述中不清楚您要转换的确切内容;一些示例代码会很有帮助。

标签: c++ templates dynamic casting


【解决方案1】:

好吧,因为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

【讨论】:

  • @IceCool 正确,我添加了一个说明。
  • 如果你有error C2683: 'dynamic_cast' : '...' is not a polymorphic type,只需在基类中添加一个虚拟析构函数virtual ~A() { }
【解决方案2】:

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

由于C 是一个模板,所以真的没有“C 型”。而是C&lt;int&gt;C&lt;Foo&gt;(假设您有一个模板参数)。模板只有在专门化时才成为类。

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

 class D : public C<int>
 {
 };

你可以dynamic_castC&lt;int&gt;,但不能说C&lt;float&gt;

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

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

所以 C 不是 D 的父级,但 C&lt;int&gt; 是(在此示例中)。 C 的实例在运行时并不真正存在,只有完全指定的 C&lt;type&gt; 实例实际存在。

【讨论】:

  • 不仅仅是运行时——C 不是类型,句号。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2012-06-03
相关资源
最近更新 更多