C++ 阵列随机存取C++;

C++ 阵列随机存取C++;,c++,polymorphism,dynamic-arrays,derived-class,dynamic-cast,C++,Polymorphism,Dynamic Arrays,Derived Class,Dynamic Cast,在写这篇文章时,我可能会感到困惑,请提前道歉: 是否有一种方法可以使用sizeof()数组中的对象访问指针的动态数组(增加数组指针)中的位置 例如: 我有一个基类Student类型的动态数组,其中填充了派生类对象(毕业生、本科生) 由于这个原因,我不能以正常的方式通过数组来显示信息,因为毕业生和本科生的实际对象与学生的大小不同。当实际对象较大时,每个阵列步骤将移动sizeof(Student) 根据我所学的学生类型(这是针对研究生的): 其中声明了arr:Student*arr=新学生[size

在写这篇文章时,我可能会感到困惑,请提前道歉:

是否有一种方法可以使用
sizeof()
数组中的对象访问指针的动态数组(增加数组指针)中的位置

例如: 我有一个基类Student类型的动态数组,其中填充了派生类对象(毕业生、本科生)

由于这个原因,我不能以正常的方式通过数组来显示信息,因为毕业生和本科生的实际对象与学生的大小不同。当实际对象较大时,每个阵列步骤将移动
sizeof(Student)

根据我所学的学生类型(这是针对研究生的):

其中声明了
arr
Student*arr=新学生[size]

使用我的数组,我在for循环中创建了以下内容:

if (!students[i].getGradStatus()){
    handleGraduate(&students[i], i);
    step = step + sizeof(Graduate);
}
else if (students[i].getGradStatus()){
    handleUndergraduate(&students[i], i);
    step = step + sizeof(Undergraduate);
}
我在想办法改变步长。我不认为这将与for循环一起工作,但是while循环可能会有所不同。我正在尝试类似于一个文件
seekg()
,但是在数组上手动执行


正如我注意到的,每个人都喜欢质疑向量上动态数组的使用,所以让我说我不能在这个项目上使用向量(不允许使用STL:()。我必须使用多态性,因此我有一个Student类型的数组指针,它包含派生类对象。

将数组更改为Student指针数组,而不是Student对象数组

 Student **arr = new Student*[size];

当您这样做时,您的对象将位于堆上,并且指针大小始终相同,因此您遇到的问题将消失。

将您的数组更改为学生指针数组,而不是学生对象数组

 Student **arr = new Student*[size];

当您这样做时,您的对象将位于堆上,指针大小始终相同,因此您遇到的问题将消失。

因为您可以编写,我假设可以实例化一个学生(非派生)。这很糟糕,因为您将在数组中存储派生对象,所以您的学生将被切片(可怜的学生!)。为了反驳你们在用实例类型的大小做奇怪的事情。只是不要

创建一个学生指针数组,
student**arr
。指针的大小是固定的,它们将指向任何派生类型的学生,因此您不必担心它们的大小



这应该是可行的。

因为你可以写,我假设可以实例化一个学生(非派生)。这很糟糕,因为你要在数组中存储派生对象,你的学生将被切片(可怜的学生!)。为了反驳你对实例类型的大小做了奇怪的事情。不要这样做

创建一个学生指针数组,
student**arr
。指针的大小是固定的,它们将指向任何派生类型的学生,因此您不必担心它们的大小



这应该是可行的。

您不能在这样的数组中存储不同大小的对象。当您尝试将派生类型(如
Graduate
)复制到基本类型(如
Student
)上时,由于对象大小的差异,您会得到所谓的切片(部分可能会被切掉)

为此,您需要存储
Student*
(指向
Student
的指针)


您不能在这样的数组中存储不同大小的对象。当您尝试将派生类型(如
Graduate
)复制到基本类型(如
Student
)上时,由于对象大小的差异,您会得到所谓的切片(部分可能会被切掉)

为此,您需要存储
Student*
(指向
Student
的指针)


这就是为什么多态层次结构中的非叶类应该是抽象的……等等,这样你的数组就包含了实际的对象而不是指向它们的指针?对于你的数组来说,指针的大小在这里很重要,而不是学生对象。我遗漏了什么吗?这通常是通过指针数组来完成的(
Student**arr
)。然后每个元素都可以指向层次结构中的不同类。你说你想做的是可能的,但对胆小的人来说是不行的。@1201程序我已经读过(并尝试过)但是在传递指针数组和访问单个指针之间的某个地方,子类信息被分割。要么是这样,要么是我做错了。我还没有找到关于动态指针数组的简单示例/教程。您分配给数组的方式不正确。您创建了一个新的Student数组s、 然后实例化一个新的毕业生,然后将指针分配给
arr[i]处的实例
。这就是为什么多态层次结构中的非叶类应该是抽象的…等等,所以数组包含实际对象而不是指向它们的指针?对于数组填充的大小,指针在这里很重要,而不是学生对象。我缺少什么吗?这通常是通过指针数组来完成的(
Student**arr
)。然后每个元素都可以指向层次结构中的不同类。你说你想做的事是可能的,但对胆小的人来说不是。@1201程序我已经读过(并尝试过)但是在传递指针数组和访问单个指针之间的某个地方,子类信息被分割。要么是这样,要么是我做错了。我还没有找到关于动态指针数组的简单示例/教程。您分配给数组的方式不正确。您创建了一个新的Student数组s、 然后实例化一个新的毕业生,然后将指针分配到
arr[i]
处的实例。我只是在上面留下了一条注释:(我只是在上面留下了一条注释:(但是当我需要访问我创建的一个毕业生指针中的信息时,我如何访问它?
student[i].getName();
没有work@Alyssa你现在和我一起工作
Student **student = new Student*[size];
...
student[i] = new Graduate(...);
class Student
{
    std::string name;
public:
    Student(const std::string& name): name(name) {}
    virtual ~Student() {} // virtual destructor

    virtual void handle() = 0; // implementation must override this

    std::string get_name() const { return name; }
};

class Graduate
: public Student
{
public:
    Graduate(const std::string& name): Student(name) {}
    virtual void handle() { std::cout << "Handling Graduate" << '\n'; }
};

class UnderGraduate
: public Student
{
public:
    UnderGraduate(const std::string& name): Student(name) {}
    virtual void handle() { std::cout << "Handling UnderGraduate" << '\n'; }
};

int main()
{
    Student** students = new Student*[3];

    students[0] = new Graduate("Wendy");
    students[1] = new UnderGraduate("Bob");
    students[2] = new Graduate("Rachel");

    for(int i = 0; i < 3; ++i)
    {
        std::cout << students[i]->get_name() << '\n';
        students[i]->handle(); // polymorphic function (virtual)
    }

    delete[] students; // clean up or (better) use a smart pointer
}
Wendy
Handling Graduate
Bob
Handling UnderGraduate
Rachel
Handling Graduate