Запазване на различни класове в една колекци?!
Опитвам се да работя с една колекция, в която да пазя различни класове. Но имам необяснимо за мен държане.
Малко дълъг код, но....
#include <sstream>
#include <typeinfo>
#include <map>
#include <iostream>
using namespace std;
enum CourceType { Java, CSharp };
class Person
{
public:
	Person() {};
	Person(int id, string personName) : personId(id), name(personName), courcesCount(1){};
	virtual ~Person() {}
	int getCourcesCount() const
	{
		return courcesCount;
	}
	string getName() const
	{
		return name;
	}
	virtual string toString()
	{
		ostringstream result;
		result 		
			<< "Person id: " << personId << endl
			<< "Person name: " << getName() << endl
			<< "All cources number: " << getCourcesCount() << endl;
		return result.str();
	}
protected:
	int personId;
	string name;
	CourceType currentCource;
	int courcesCount = 0;
};
class Student : public Person
{
public:
	Student(int id, string name, int points) : Person(id, name), points(points) {};
	
	string toString() override
	{
		ostringstream result;
		result
			<< typeid(this).name() << endl
			<< Person::toString()
			<< "Average points: " << points / getCourcesCount() << endl;
		return result.str();
	}
private:
	int points;
};
typedef map<int, Person*> Database;
Database myDB;
int counter = 0;
Person* getPersonById(int id)
{
	Database::iterator it = myDB.find(id);
	if (it != myDB.end())
	{
		return it->second;
	}
	
	return nullptr;
}
int main()
{
	Person * p1;
	Student s(++counter,"Test", 100);
	p1 = &s;
	myDB[counter] = p1;
	myDB[++counter] = &Student(counter,"Test1", 80);
	int searchingKey = 2;
	Person * resultPerson = getPersonById(searchingKey);
	if (resultPerson != nullptr)
	{
		cout << resultPerson->toString();
	}
	else
	{
		cout << "No person found with key: " << searchingKey << endl;
	}
}
Когато използвам myDB[++counter] = &Student(counter,"Test1", 80); не се печата името, докато ако изполвам
Person * p1;
Student s(++counter,"Test", 100);
p1 = &s;
myDB[counter] = p1;
всичко е ОК. Не мога да схвана защо ?!?
