gpt4 book ai didi

c++ - 将派生类作为值放入 STL 映射中

转载 作者:太空宇宙 更新时间:2023-11-04 15:49:10 25 4
gpt4 key购买 nike

我有 2 个简单的类。基类A , 和派生类 B .出于调试目的,复制构造函数和析构函数被覆盖为 cout东西:

class A
{
protected:
char * c;
public:
A(char * c) : c(c) { cout << "+A " << this << "\n"; }
A(const A& other) : c(other.c) { cout << "*A " << this << "\n"; }
~A() { cout << "-A " << this << "\n"; }
};

class B : public A
{
public:
B(char * c) : A(c) { cout << "+B " << this << "\n"; }
B(const B& other) : A(other.c) { cout << "*B " << this << "\n"; }
~B() { cout << "-B " << this << "\n"; }
};

我是这样的insert B 的实例进入map :

    {
cout << "-- 1\n";
map<string, A> m;
cout << "-- 2\n";
m.insert(pair<string, A>( "b", B("bVal")));
cout << "-- 3\n";
}
cout << "-- 4 --\n";

结果:

-- 1
-- 2
+A 0051F620
+B 0051F620
*A 0051F5EC
*A 00BD8BAC
-A 0051F5EC
-B 0051F620
-A 0051F620
-- 3
-A 00BD8BAC
-- 4 --

关于实例的创建,我是这样理解的:

  1. B由我自己的代码创建
  2. 那个B被复制构造成 A通过 pair
  3. 最后A然后实例再次被 map 复制, 它被插入的地方

顺便说一句,改变pairinsert线到 pair<string, B>没有成功,它只是改变了第二步来创建一个 B而不是 A ,但最后一步会将其降级A再次。在 map 本身符合销毁条件之前, map 中唯一保留下来的实例似乎是最后一个 A。实例。

我做错了什么以及我应该如何将派生类放入 map 中?使用格式的 map

map<string, A*>

也许吧?

更新 - 解决方案 由于我的解决方案没有直接在接受的答案中说明,而是以建议的形式隐藏在评论中,因此我最终做了以下事情:

map<string, shared_ptr<A>> m;

这假设您的构建环境支持 shared_ptr s - 我的(C++/CLI,Visual Studio 2010)做的。

最佳答案

这叫做 slicing当派生类不适合分配给它的对象时,就会发生这种情况。这是一个简单的例子:

B b;
A a = b; // This would only copy the A part of B.

如果您想在 map 中存储不同类型的对象,使用 map<..., A*> 是正确的方法,正如您正确推断的那样。由于该对象未存储在映射中,而是存储在堆中的某个位置,因此无需复制它并且它始终适合。

关于c++ - 将派生类作为值放入 STL 映射中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11499732/

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