gpt4 book ai didi

c++ - 可继承类的模板类的转换

转载 作者:行者123 更新时间:2023-11-30 02:56:22 25 4
gpt4 key购买 nike

我有BaseDerived类和模板类 Container哪个参数可以是 Base以及Derived .我需要投 Container<Derived>Container<Base>有可能这样做吗?我应该使用哪种转换?

最佳答案

不,这是不可能的。 Container<Derived>不源自 Container<Base> , 它们只是同一类模板的两个实例。

这是有道理的:想象一个 Container<Derived>将是 Container<Base> 的有效替代品对于需要 Container<Base> 的函数,并想象有一个二等舱Derived2源自 Base , 但与 Derived 无关:

void foo(Container<Base>& cont)
{
Derived2 obj;
cont.push_back(obj);
}

Container<Derived> c;
foo(c);

在上面的代码片段中,您将尝试插入类型为 Derived2 的对象放入 Derived 的容器中元素。绝对不是什么好事。

此外,如果你想利用多态行为,你应该在你的容器中使用(智能)指针:

Container<std::shared_ptr<Base>> cb;
// ... fill it in...

Container<std::shared_ptr<Derived>> cd;
for (auto &pB : cb)
{
std::shared_ptr<Derived> pD = std::dynamic_pointer_cast<Derived>(pB);
if (pD != nullptr)
{
cd.push_back(pD);
}
}

这是一个(可能的)完整示例:

#include <memory>
#include <vector>
#include <iostream>

template<typename T>
using Container = std::vector<T>;

struct Base { virtual ~Base() { } };
struct Derived : Base { };

int main()
{
Container<std::shared_ptr<Base>> cb;
cb.push_back(std::make_shared<Derived>());
cb.push_back(std::make_shared<Base>());
cb.push_back(std::make_shared<Derived>());

Container<std::shared_ptr<Derived>> cd;
for (auto &pB : cb)
{
std::shared_ptr<Derived> pD = std::dynamic_pointer_cast<Derived>(pB);
if (pD != nullptr)
{
cd.push_back(pD);
}
}

std::cout << cd.size(); // Prints 2
}

关于c++ - 可继承类的模板类的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549325/

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