2013-03-05 137 views
0

新的托管c + +和堆栈溢出,所以我希望我这样做是正确的。从基类引用派生类参数

我很难找到一种方法来编写一个基类参数,需要派生类的类变量的函数。

我的基类叫做ImageBase,它有两个类变量:int rows,cols;

public ref class ImageBase 
{ 
    public: 
     int num_rows; 
     int num_cols; 
} 

从派生是一个抽象,模板类称为ImageT仅包含模板化2-d阵列,PIX:

template<class T> public ref class ImageT abstract : public ImageBase 
{ 
public: 
    property T** pix 
    { 
     public: T** get() { return rows; } 
     protected: void set(T** val) { rows = val; } 
    } 
} 

从ImageT派生是RealImage,ShortImage和ComplexImage,其简单地改变模板类型“T”分别浮动,缩短或复杂。下面是类结构的一个小MS画图图,如果这是比较容易理解:

Class Hierarchy

我的问题是:如果我写的是一个非常一般的功能:

void printPixels(ImageBase^ img) 

所以我可以将它传递给RealImage,ComplexImage等,我如何从ImageBase类型访问变量“pix”?

回答

0

你不行。至少不是没有窍门。

为了解决这个问题,我会建议模板化的printPixels()功能:

template<class T> void printPixels(ImageT<T>^ img) 

如果你真的需要它,你可以添加一个printPixels(ImageBase^ img),检查IMG的类型,蒙上它,并调用合适的printPixels(ImageT<T>^ img)为真正的工作。

+0

试图混淆dynamic_casts后,我终于成功检查了img的类型,然后进行普通投射。 (t == Image :: typeid) \t \t Image^newImage =(Image ^)img; 感谢您的回复。 – Sooji 2013-03-07 16:11:15