Есть ли способ отойти, преодолеть нарезку объектов без использования нового ключевого слова в качестве параметра для работы? У меня есть базовый объект
class Person{
public:
Person(string name , int age ){
this -> name = name;
this -> age = age;
}
virtual void getInfo(){
cout << "Person " << name << " " << age;
}
void add( string name , Person a){
Person *one = new Person(a);
m[ name ] = one;
}
void print(){
for( auto &x: m )
x.second -> getInfo()
}
protected:
string name;
int age;
map< string , Person*> m;
};
Производные объекты
class Kid : public Person{
public:
Kid(string name, int age):Person(name,age){};
virtual void getInfo( ){
cout << "Kid " << name << " " << age;
}
};
class Adult : public Person{
public:
Adult(string name, int age):Person(name,age){};
virtual void getInfo( ){
cout << "Adult " << name << " " << age;
}
};
И пытаясь вызвать его, например
Person one("John", 25);
one.add("first",Kid("Mathew",15));
one.add("second",Adult("Leo",55));
one.print();
Из-за нарезки объекта он печатает
"Человек..."
Я пробовал использовать unique_ptr
и получил тот же результат. Я попытался объявить copy function
, например
vitual clone() const{ return new Person(*this);}
в базовом классе
и в производных классах я объявил
Kid* clone() const{ return new Kid(*this);}
Adult* clone() const{ return new Adult(*this);}
и отредактировал функцию добавления.
void add( string name , Person a){
Person *one = a.clone();
m[ name ] = one;
}
И я все еще был поражен скользящим предметом. Я пробовал разные вещи/подходы/методы, и все они привели к нарезке объектов.
Есть ли способ создать такую вещь (карту, которая содержит производные классы базового класса) без использования ключевого слова new
в аргументе функции, например
Person one("bla",5);
one.add("asd", new Kid("one",15))
Спасибо за помощь.
// Текущее состояние кода
class Person{
public:
Person(string name , int age ){
this -> name = name;
this -> age = age;
}
virtual void getInfo(){
cout << "Person " << name << " " << age;
}
void add( string name , const Person &a){
Person *one = a.clone();
m[ name ] = one;
}
void print(){
for( auto &x: m ){
x.second -> getInfo();
cout << endl;
}
}
virtual Person* clone() const{ return new Person(*this);}
protected:
string name;
int age;
map< string , Person*> m;
};
class Kid : public Person{
public:
Kid(string name, int age):Person(name,age){};
virtual void getInfo( ){
cout << "Kid " << name << " " << age;
}
Kid* clone() const{ return new Kid(*this);}
};
class Adult : public Person{
public:
Adult(string name, int age):Person(name,age){};
virtual void getInfo( ){
cout << "Adult " << name << " " << age;
}
Adult* clone() const{ return new Adult(*this);}
};
int main(){
Person one("John", 25);
one.add("first",Kid("Mathew",15));
one.add("second",Adult("Leo",55));
one.print();
}