构造函数调用子类

时间:2013-10-15 21:02:27

标签: c++ subclass superclass object-slicing

我有一个(部分实现的)类层次结构

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构造函数。

我无法让它工作,人们会警告切片,虚拟构造函数等等。但这是一种奇怪的设置方式吗?

3 个答案:

答案 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类来猜测是否使用图像。在您需要的地方使用imagejpgimage类,并使其他所有内容都使用通用的data类。