我有类人:
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
使其适合作为多态类型的基类。然后,两个
Child
和 Adult
从 Person
公开继承,因为您已经拥有它们。他们的构造函数最终调用 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
的唯一方法。的年龄,并且在那一刻,您将有权决定是否创建 Child
或 Adult
基于新时代的对象。为此,首先,限定
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/