【发布时间】:2016-10-11 11:21:32
【问题描述】:
我目前正在尝试将存储在共享指针中的派生类的类型切换到基类。 问题是 Derived 类继承自 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<e0>和Derived<e1>的大小不同,你怎么能做到这一点?你的设计(或你试图做的)可能有缺陷。
标签: c++ pointers inheritance