子类指针的转换无效

时间:2012-01-10 20:37:45

标签: c++ itk

在以下代码中:

#include "itkImage.h"
#include "itkImageRegionIterator.h"

struct CustomImageBase
{
  virtual void DoSomething() = 0;
};

template <typename TPixel>
struct CustomImage : public itk::Image<TPixel, 2>, public CustomImageBase
{
  void DoSomething()
  {
    itk::Index<2> index;
    index.Fill(0);
    std::cout << this->GetPixel(index);
  }
};

int main(int, char *[])
{
  std::vector<CustomImageBase*> images;

  CustomImage<float>* floatImage = CustomImage<float>::New().GetPointer();
  CustomImage<int>* intImage = CustomImage<int>::New().GetPointer();

  return EXIT_SUCCESS;
}

我收到错误:从itk :: Image *到CustomImage *

的无效信号

请注意,这样可以正常工作:

itk::Image<float>* testFloatImage = itk::Image<float>::New().GetPointer();

由于CustomImage继承自itk :: Image,我不明白这个问题?

3 个答案:

答案 0 :(得分:1)

  

由于CustomImage继承自itk :: Image,我不明白这个问题?

由于CustomImage继承自itk::Image,这意味着CustomImage*可以隐式转换为itk::Image*。但是,编译器抱怨相反转换:

  

无效的转换来自 itk::Image* CustomImage*

这需要显式的类型转换。

我无法编译您的代码,因为我没有先决条件,并且您没有说出编译器不喜欢的代码行,因此此时很难提供进一步的帮助。

答案 1 :(得分:1)

如果B来自A,则无法将A*转换为B*。如果C也来自A,并且您的A*确实指向C对象而不是B对象,那么如果您会发生什么?假装它是B?转换是不安全的。在您的情况下,知道GetPointer()将始终返回CustomImage<T>。编译器不知道这一点。您可以使用演员表来告诉它:

CustomImage<float>* floatImage = static_cast<CustomImage<float>*>(CustomImage<float>::New().GetPointer());

修改:这正是转换不安全的原因:在阅读了您的问题评论后,我不相信CustomImage<float>::New().GetPointer()确实指向{{1} ,如果没有,那么强制转换只会将编译器错误转化为运行时错误。

答案 2 :(得分:0)

假设这是允许的。现在考虑以下内容:

struct yet_another_image : public itk::Image<TPixel, 2> {
}

yet_another_image img;
itk::Image<TPixel, 2>* ptr = &img; // ok
CustomImage* bad = ptr; // oops!

您可以安全地从指向派生类的指针转换为指向基类的指针,但是您无法安全地转换其他方式,因为您不知道指向的对象是否具有正确的类型。 / p>