наследование — наследование C ++: сигнатуры функций для базового типа не работают с производным типом

У меня есть следующий код:

class STFDataPoint {
public:

virtual ImagePoint get_patch_top_left() const = 0;
virtual ImagePoint get_patch_bottom_right() const = 0;
virtual std::string get_image_filename() const = 0;

virtual ~STFDataPoint() = 0;
};
inline STFDataPoint::~STFDataPoint() {}class TrainingDataPoint : public STFDataPoint{
private:
int row;
int col;
std::string class_label;
ImagePoint patch_top_left;
ImagePoint patch_bottom_right;
std::string image_filename;
public:
TrainingDataPoint(int row, int col, std::string class_label,
const ImagePoint & top_left,
const ImagePoint & bottom_right,
std::string image_filename);

std::string get_class_label() const;

inline bool operator==(const TrainingDataPoint& other) const{
return other.class_label == this->class_label;
}
inline bool operator!=(const TrainingDataPoint& other) const{
return !(*this == other);
}

virtual ImagePoint get_patch_top_left() const;
virtual ImagePoint get_patch_bottom_right() const;
virtual std::string get_image_filename() const;

};

И я пытаюсь запустить следующее:

bool do_something(vector<STFDataPoint>& data_point){
return true;
}int main(int argc, char* argv[]) {

ImagePoint left = ImagePoint(2,3);
ImagePoint right = ImagePoint(2,3);

TrainingDataPoint a = TrainingDataPoint(1,2,"",left, right, "");
vector<TrainingDataPoint> b;
b.push_back(a);

do_something(b);
}

Но получите следующую ошибку:

invalid initialization of reference of type ‘std::vector<STFDataPoint>&’ from expression of type `std::vector<TrainingDataPoint>`

Однако, если я изменю подпись do_something() взять в STFDataPoint (не вектор из них) он работает нормально. Может кто-нибудь объяснить, почему это так, а также, если есть обходной путь?

Спасибо

2

Решение

поскольку vector<TrainingDataPoint> не является подтипом vector<STFDataPoint> ты не сможешь это сделать. Векторы не ковариант в типе параметра.

Однако вы можете шаблон do_something чтобы это работало:

template <typename T>
bool do_something(vector<T>& data_point){
//common actions like
ImagePoint leftPatch = data_point[0].get_patch_top_left();
return true;
}
4

Другие решения

Тип vector<TrainingDataPoint> это не то же самое, что vector<STFDataPoint> и нет никакого преобразования между ними. vector<A> не является базовым типом vector<B>, даже если A является основой B,

Что может сработать, так это иметь контейнер указателей или интеллектуальных указателей на базовый тип и изменить функцию, чтобы использовать это:

bool do_something(vector<std::unique_ptr<STFDataPoint>>& data_point){
return true;
}

std::vector<std::unique_ptr<STFDataPoint>> b;
b.push_back( std::unique_ptr<STFDataPoint>(new TrainingDataPoint(1,2,"",left, right, "") ); // fill with any derived types of STFDataPoint
do_something(b);
3

По вопросам рекламы [email protected]