gpt4 book ai didi

c++ - 将共享指针的派生类切换到基类

转载 作者:行者123 更新时间:2023-11-30 05:21:44 24 4
gpt4 key购买 nike

我目前正在尝试将存储在共享指针中的派生类的类型切换为基类。问题是 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 ); }
};

我的目标是有一个指向 Base 类的共享指针,这样就可以从 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_00sp_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 的运行时类型无需重新分配它,因为您无法分配 Derived<e1>Derived<e0> (想一想如果它们没有相同的大小会发生什么 - 你已经为 Derived<e0> 分配了足够的大小,而不是为 Derived<e1> !)。

在我看来,您的设计(或您尝试用它做的事情)在某处存在缺陷。但是,如果您真的想在 sp_00 之间保持“链接”和 sp_01 ,您可能需要另一个“级别”的指针:

int main() {
std::shared_ptr<Base> *psp_01;

std::shared_ptr<Base> sp_00 = std::make_shared<Derived<e0>> ();
psp_01 = &sp_00;

(*psp_01)->print();

std::shared_ptr<Base> sp_10 = std::make_shared<Derived<e1>> ();
psp_01 = &sp_10;

(*psp_01)->print();
sp_10->print();
}

但同样,在使用它之前我会分析我的设计两次。

关于c++ - 将共享指针的派生类切换到基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com