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

标签 c++ class inheritance polymorphism

我有类人:

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/

相关文章:

c++ - Visual Studio 2017 中关于 constexpr 表达式的编译问题

c++ - 制作一个允许输入中有空格的读取函数(C++)

c++ - Armadillo:将多个数据集保存在一个 hdf5 文件中

c++ - 为什么 const 方法不能返回非常量引用?

python - 实现特定于类的方法但不直接使用属性的最佳方式

c++ - 如何使用重载运算符合并两个数组?

php - 如何使用(原始)FTP(CURL)获取 PHP 的 stat() 等详细信息?

java - Hibernate Table 未找到、MappingException 和 AssertionException

c++ - 没有构造函数实例 "Class:Class"匹配参数列表

perl - 如何创建一个对象,其派生类由创建属性隐式指定?