В настоящее время я пытаюсь переключить тип производного класса, хранящегося в общем указателе на базовый класс. Проблема состоит в том, что производный класс наследует от класса Base, и также шаблонный следующим образом:Переключатель Производный класс общего указателя на базовый класс
Базовый класс:
#define PRINT(s) std::cout << s << std::endl
class Base {
public:
Base() : m_a(1) {}
virtual ~Base() = default;
virtual void print() { PRINT("BASE"); }
int m_a;
};
Производный класс зависит от шаблона перечисления:
enum eType { e0, e1 };
template<eType et>
class Derived : public Base { };
template<>
class Derived<e0> : public Base {
public:
Derived() { this->m_a = e0; }
void print() { PRINT("Derived e0, m_a value: " << e0); }
};
template<>
class Derived<e1> : public Base {
public:
Derived() { this->m_a = e1; }
void print() { PRINT("Derived e1, m_a value: " << e1); }
};
Моя цель состоит в том, чтобы иметь общий указатель на базовый класс, чтобы можно было перейти от 2 производных классов следующим образом:
int main()
{
std::shared_ptr<Base> sp_00 = std::make_shared<Derived<e0>>();
std::shared_ptr<Base> sp_01 = sp_00;
sp_01->print();
std::shared_ptr<Base> sp_10 = std::make_shared<Derived<e1>>();
*sp_01 = *sp_10;
sp_01->print();
sp_10->print();
}
Единственная проблема, как на линии *sp_01 = *sp_10;
Я ожидаю, что указатель на базовый класс переключится с производного типа Derived<e0>
на производный тип Derived<e1>
. Однако в моем примере я получаю другой результат для строки sp_01->print();
и строки sp_10->print();
, указывающей, что sp_01
остается как Derived<e0>
.
Я хочу избежать sp_01 = sp_10;
, потому что он изменит указатель. В приведенном выше примере это приведет к sp_00 != sp_01
, и я хочу, чтобы оба sp_00
и sp_01
делили тот же объект.
Я пытался заменить шаблон производного класса с помощью шаблона, не производный класс следующим образом:
class Derived_e0 : public Base {
public:
Derived() { this->m_a = e0; }
void print() { PRINT("Derived e0, m_a value: " << e0); }
};
class Derived_e1 : public Base {
public:
Derived() { this->m_a = e1; }
void print() { PRINT("Derived e1, m_a value: " << e1); }
};
и следующий код дают тот же результат, что и один с шаблоном.
int main()
{
std::shared_ptr<Base> sp_00 = std::make_shared<Derived_e0>();
std::shared_ptr<Base> sp_01 = sp_00;
sp_01->print();
std::shared_ptr<Base> sp_10 = std::make_shared<Derived_e1>();
*sp_01 = *sp_10;
sp_01->print();
sp_10->print();
}
Так что мой вопрос, как переключиться на производный объект, на который указывает общий указатель без изменения самого shared_ptr (который используется в другой части программы?)
Спасибо, если вам нужна Дополнительная информация, пожалуйста, дайте мне знать
Вы не можете изменить «полиморфный тип» 'sp_01' без переназначения' sp_01'. Как вы могли это сделать, если 'Derived' и 'Derived ' не имели тот же размер? Ваш дизайн (или то, что вы пытаетесь сделать), вероятно, испорчен. –
Holt