Is there a way how to step away , overcome object slicing without using new keyword as paramater to function? I have base object
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;
};
Derived objects
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;
}
};
And trying to invoke it such as
Person one("John", 25);
one.add("first",Kid("Mathew",15));
one.add("second",Adult("Leo",55));
one.print();
Due to object slicing it prints
"Person..."
I have tried using unique_ptr
and ended up with same result.
I tried declaring copy function
such as
vitual clone() const{ return new Person(*this);}
in base clase
and in derived classes i declared
Kid* clone() const{ return new Kid(*this);}
Adult* clone() const{ return new Adult(*this);}
and edited add function.
void add( string name , Person a){
Person *one = a.clone();
m[ name ] = one;
}
And i was still strucked down by a object slicind. I have tried various things/approaches/methods and all led to object slicing.
Is there a way how to create such thing ( map that holds derivec classes of base class ) without using new
keyword in the argument of function e.g
Person one("bla",5);
one.add("asd", new Kid("one",15))
Thanks for help.
// Current state of the code
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();
}