gpt4 book ai didi

c++ - 根据继承更改对象类型

转载 作者:行者123 更新时间:2023-12-02 10:21:36 27 4
gpt4 key购买 nike

我有类人:

class Person {
public:
int Age;
int ID;
};

我有 2 个类:继承人的成人和 child :
class Child : Person{
public:
Child();
void print_ms_child(){
cout << "I'm an child";
}
};

class Adult : Person{
public:
Adult();
void print_ms_Adult(){
cout << "I'm an adult";
}
};

我想声明一个人对象
int main() {
Person my_Person;
my_Person.Age = 10;
my_Person.ID = 013272;

然后使用条件来设置它的类型。
    if(my_Person.Age > 18){
my_Person = new Adult(); // this won't work
}
else{
my_Person = new Child(); // this won't work
}

我想这是可能的,但我不知道正确的语法( 我该怎么做? )。 (很抱歉发布甚至无法编译的代码)

还有 ,如果年龄发生变化,我想从 child 更改为成人(我什至不确定这是否可能)。
    my_Person.Age = 21;
my_Person = new Adult(); // this won't work

最佳答案

我会先定义你的类(class)Person像这样:

class Person {
int Age;
int ID;
protected:
Person(int age, int id): Age{age}, ID{id} {}
public:
virtual ~Person() = default;
};

也就是说, Person的构造函数是 protected这样层次结构之外的类就不能创建 Person对象,其析构函数为 virtual使其适合作为多态类型的基类。

然后,两个 ChildAdultPerson 公开继承,因为您已经拥有它们。他们的构造函数最终调用 Person的构造函数具有相同的参数化,它们的构造函数接收:
class Adult: public Person {
public:
Adult(int age, int id): Person(age, id) {}
// ...
};

class Child: public Person {
public:
Child(int age, int id): Person(age, id) {}
// ...
};

最后,用于创建派生自 Person 的对象,我将在下面创建工厂函数:
std::unique_ptr<Person> create_person(int age, int id) {
if (age < 18)
return std::make_unique<Child>(age, id);
else
return std::make_unique<Adult>(age, id);
}

这个工厂函数创建一个 Child如果要创建的人的年龄小于 18 岁,则创建对象。否则,它会创建 Adult目的。这——确定要创建的对象的类型——是在运行时完成的。

编辑:您想知道 Child对象可能变成 Adult对象的年龄已达到 18 岁。

我建议将状态设为 Person对象是不可变的,因此每次人的年龄增加时都必须创建一个新的对象。这样,从现有对象创建新对象将是增长 Person 的唯一方法。的年龄,并且在那一刻,您将有权决定是否创建 ChildAdult基于新时代的对象。

为此,首先,限定 Age Person 中的数据成员如 const (你可以用 ID 做同样的事情)。然后,定义以下 Person的成员函数,它总是创建一个新对象(具有相同的 ID ),这是由于增加了 Person的对象 Age由一个:
std::unique_ptr<Person> Person::increase_age() const {
return create_person(Age + 1, ID);
}

如您所见,它将对象的创建委托(delegate)给工厂函数 create_person()。 ,上面已经解释过了。此成员函数可以在 Child 上调用。和 Adult对象,因为它继承自 Person .

关于c++ - 根据继承更改对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59910998/

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