【发布时间】:2021-06-18 10:38:14
【问题描述】:
我阅读了Passing shared_ptr<Derived> as shared_ptr<Base>,但这并没有回答我的问题。
假设我们有
class Base
{
};
class Derived : public Base
{
};
我想创建以下容器:std::map<int, std::shared_ptr<std::unordered_map<std::string, std::shared_ptr<Base>>>> _channels;
我需要将实例添加为类型为 std::shared_ptr<std::unordered_map<std::string, std::shared_ptr<Base>>> 和 std::shared_ptr<std::unordered_map<std::string, std::shared_ptr<Derived>>> 的值。
很遗憾,我无法添加 Derived 类型的实例,但 Base 类型的实例很好。
完整代码:
#include <iostream>
#include <string>
#include <map>
#include <unordered_map>
#include <memory>
#include <utility>
class Base
{
};
class Derived : public Base
{
};
int main()
{
// works fine
/*
std::map<int, std::shared_ptr<Base>> _channels2;
_channels2.emplace(std::pair<int, std::shared_ptr<Derived>>(3, std::make_shared<Derived>()));
std::cout << "_channels2.size() = " << _channels2.size() << std::endl;
*/
// fails to compile
std::map<int, std::shared_ptr<std::unordered_map<std::string, std::shared_ptr<Base>>>> _channels;
_channels.emplace(std::pair<int, std::shared_ptr<std::unordered_map<std::string, std::shared_ptr<Derived>>>>(2, std::make_shared<std::unordered_map<std::string, std::shared_ptr<Derived>>>()));
std::cout << "_channels.size() = " << _channels.size() << std::endl;
return 0;
}
我正在使用 C++14。
-
我理解得很好,所以它无法编译的原因是因为
std::shared_ptr<std::unordered_map<std::string, std::shared_ptr<Derived>>>不是std::shared_ptr<std::unordered_map<std::string, std::shared_ptr<Base>>>的子类型?所以在这种情况下多态是不可用的。 -
您有什么解决方法可以建议吗?
谢谢。
【问题讨论】:
-
乘坐两辆公共汽车:一辆只有父亲,第二辆只有他们的孩子。第一辆公共汽车必须是第二辆公共汽车的父亲吗?
-
嗯,是的,我的主要问题是是否存在像 Java 中的通配符扩展参数这样的语言特性。
标签: c++ inheritance stl c++14 liskov-substitution-principle