У меня есть следующая проблема, которую я действительно не смог бы хорошо описать в одном предложении в названии.
У меня упрощенная иерархия классов, которую я не могу изменить
class Base {
protected:
std::vector<int> a_;
public:
virtual ~Base() = default;
Base(std::vector<int> a): a_(std::move(a)) {}
virtual void do_stuff() { /*modify a_*/ }
};
class Derived: public Base {
protected:
std::vector<int> b_;
public:
Derived(std::vector<int> a, std::vector<int> b): Base(std::move(a)), b_(std::move(b)) {}
void do_stuff() override {
Base::do_stuff();
/*modify b_*/
}
};
Мне нужно добавить некоторые функциональные возможности в эту иерархию, поэтому я создал «расширенную» иерархию:
class BaseExtended {
private:
Base underlying_;
int x_;
public:
virtual ~BaseExtended() = default;
BeseExtended(std::vector<int> a, int x): underlying_(std::move(a)), x_(x) {}
virtual void do_more() {
underlying_.do_stuff();
/* do more stuff according to x_ */
}
};
class DerivedExtended: public BaseExtended{
private:
Derived underlying_;
int y_;
public:
DerivedExtended(std::vector<int> a, int x, std::vector<int> b, int y)
:BaseExtended(std::move(a), x), underlying_(std::move(b)), y_(y) {}
void do_more() override {
BaseExtended::do_more();
underlying_.do_stuff();
/* do more stuff according to y_ */
}
};
Но это не делало то, что я хочу, который имеет только два вектора v1 и v2 сохраняются после того, как я позвоню
std::shared_ptr<BaseExtended> de = new DerivedExtended(v1, 1, v2, 2);
Я не знаю, можно ли этого достичь без изменения исходных классов, особенно как хранить только один копия вектора v1 в DerivedExtended . Можно ли это сделать?