我有 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 --
关于实例的创建,我阅读如下:
B
由我自己的代码创建- 被
B
复制构造成A
bypair
- 然后,最后一个实例被插入它
A
的位置再次复制map
顺便说一句,将pair
ininsert
行更改为 apair<string, B>
并没有解决问题,它仅将第二步更改为创建 anB
而不是A
,但最后一步会将其降级为 an A
。在地图本身有资格销毁之前,地图中唯一保留的实例似乎是最后一个A
实例。
我做错了什么,我应该如何将派生类放入地图?使用格式的地图
map<string, A*>
也许?
更新 - 解决方案由于我的解决方案没有直接在接受的答案中说明,而是以建议的形式隐藏在其评论中,这就是我最终做的事情:
map<string, shared_ptr<A>> m;
这假设您的构建环境支持shared_ptr
s - 我的(C++/CLI,Visual Studio 2010)支持。