C++指向基类的指针数组

C++ an array of pointers to the base class

本文关键字:指针 数组 基类 C++      更新时间:2023-10-16

有几个类是在不同的文件中创建的。 以下是班级名称:医院类和患者类。 基本上,对于医院类,它具有患者指针数组,可以根据患者类型存储患者信息。对于患者类(基类)有四个派生类,如下所示:男性、女性、住院、门诊。我想做的是,在医院课堂上,我想根据患者类型分配对象。

#include <iostream>
#include "Hospital.h"
#include "Female.h"
#include "Male.h"
#include "Inpatient.h"
#include "Outpatient.h"
using namespace std;
Hospital::Hospital(const char * name, int capacity)
{
hospitalName=name;
patientCapacity=capacity;
totalPatients=0;
}
void Hospital::determinePatientType()
{
int selection;
cout << "What is the patient type?" << endl;
cout << "1. Female" << endl;
cout << "2. Male" << endl;
cout << "3. Outpatient" << endl;
cout << "4. Inpatient" << endl;
cin >> selection;
if(selection==1)
{
patients = new Patient[totalPatients];
Female* female = new Female();
patients = female;
}
else if(selection==2)
{
patients = new Patient[totalPatients];
Male* male = new Male();
patients = male;
}
else if(selection==3)
{
patients = new Patient[totalPatients];
Outpatient* outpatient = new Outpatient();
patients = outpatient;
}
else
{
patients = new Patient[totalPatients];
Inpatient* inpatient = new Inpatient();
patients = inpatient;
}
totalPatients++;
}

这是我的代码,但我不确定它是否正确。 我将上传类图,以便您了解我在做什么。 提前感谢您的帮助。

在此处输入图像描述

不,你的代码不正确。

让我们看一下这个代码片段:

if(selection==1)
{
patients = new Patient[totalPatients];
Female* female = new Female();
patients = female;
}

patients = new Patient[totalPatients];

分配一个totalPatients对象的数组。你patients指向该数组的第一个元素。

然后你做两行

patients = female;

这会重新分配变量patients以指向单个对象female

您将丢失第一次分配的原始内存,这将导致泄漏。如果您随后使用delete[] patients,则很可能也会导致未定义的行为,因为patients不再指向数组。

除非你的练习是学习如何使用指针和动态内存分配,否则你应该使用std::vector


还有另一个潜在的问题,它与对象切片和多态性有关(如果类是多态的,即它们具有virtual成员函数)。

如果你以自然的方式解决第一个问题,例如

patients[totalPatients] = female;

或者,如果您使用std::vector<Patient>并执行简单的push_back(female).

然后对female对象进行切片,并丢失特定于Female类的所有数据。而且由于你不再有Female对象,所有虚函数都会认为它们是在Patient对象上调用的,这使得polymprphism也不起作用。

要解决此问题,您应该有一个指向基Patient类的指针向量(或数组)。std::vector<Patient*>.

或者更好的是使用像std::unique_ptr这样的智能指针,如std::vector<std::unique_ptr<Patient>>