У меня есть 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
с помощьюpair
A
затем снова копируется map
, куда он вставляетсяКстати, изменение pair
в строке insert
на pair<string, B>
не помогло, он только изменил 2-й шаг, чтобы создать B
вместо A
, но последний шаг снова понизьте его до A
. Единственный экземпляр на карте, который остается до тех пор, пока сама карта не подлежит уничтожению, кажется, это последний экземпляр A
.
Что я делаю неправильно и как я должен получить производный класс на карту? Используйте карты формата
map<string, A*>
возможно?
Обновление -Решение Поскольку мое решение не указано прямо в принятом ответе, а скорее скрыто в его комментариях в виде предложений, вот что я в итоге сделал:
map<string, shared_ptr<A>> m;
Это предполагает, что ваша среда сборки поддерживает shared_ptr
s -, что делает мой (C++/CLI, Visual Studio 2010 ).