我有一个(部分实现的)类层次结构
template<typename T> {
class data {
data ( string s ) {}; // loads from file
...
}
class image: public data <T> {
image ( string s ) {}; // loads from file
...
}
class jpgimage : public image<T> {
jpgimage ( string s ) {}; // loads from file
...
}
// other image types
}
现在在我的其余代码中,我希望能够从某个jpeg图像甚至是图像中抽象出来,所以我想使用data
。但与此同时,我希望将特定于jpeg图像的命令传递给这些函数。
因此,如果我将data<int> img("lena.jpg");
称为图像,甚至是jpeg图像,我希望数据构造函数调用图像构造函数,而构造函数又调用jpgimage构造函数。
我无法让它工作,人们会警告切片,虚拟构造函数等等。但这是一种奇怪的设置方式吗?
答案 0 :(得分:1)
继承用于是关系。因此,image<T>
是 data<T>
,但不是相反!为image<T>
对象调用特定于data<T>
的方法是没有意义的,毕竟这可能不是image<T>
。您想要这样做的事实表明您的代码设计存在缺陷。重新思考你的代码设计。
答案 1 :(得分:1)
要实现您需要数据作为实现的所有者,而不是基类:
template<typename T>
class base_data {
base_data ( string s ) {} // loads from file
// ...
};
template<typename T>
class image: public base_data <T> {
image ( string s ) {} // loads from file
...
};
template<typename T>
class jpgimage : public image<T> {
jpgimage ( string s ) {} // loads from file
// ...
// other image types
};
template<typename T>
class data {
data ( string s ) {
if(is_jpeg( s )) impl = new jpeg_data<T>( s );
// ...
} // loads from file
// ...
private:
base_data<T> *impl;
};
现在在构造函数中,您可以创建适当的实现类型等等。
答案 2 :(得分:0)
我说这是一个糟糕的设计。如果您确定知道,那么您不需要使用通用data
类来猜测是否使用图像。在您需要的地方使用image
或jpgimage
类,并使其他所有内容都使用通用的data
类。