gpt4 book ai didi

c++ - 一种克服对象切片的方法

转载 作者:行者123 更新时间:2023-11-30 03:42:08 24 4
gpt4 key购买 nike

有没有一种方法可以在不使用 new 关键字作为参数来运行的情况下摆脱、克服对象切片?我有基础对象

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();

由于对象切片它打印

"Person..."

我尝试过使用 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();
}

最佳答案

更改您的 add() 函数以通过引用接受其参数:

void add( string name , const Person &a){
Person *one = a.clone();
m[ name ] = one;
}

当您按值传递对象时,您就是在对对象进行切片。复制并切片它。您需要将参数作为引用传递。

您所有的clone() 方法都已经是常量了。好。

关于c++ - 一种克服对象切片的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36958364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com