0

注意:这是作业!

我目前正在做一个大型项目,其中我有 3 个(我们将重点关注)类,一个基类 Student,以及 2 个派生类 Grad 和 Undergrad,现在我永远不会明确使用学生类,但我将创建一个包含毕业生和本科生类型转换给学生的链接列表,我的问题是我如何实现与派生类的级联,即

在我的基类中,我有一个小函数,在 Undergrad 中完全覆盖了实现

基类:

virtual UnderGrad& setMajor(std::string) {} 

本科:

//purpose: sets the major       
UnderGrad& UnderGrad::setMajor(std::string maj)
{
    major = maj;
    return *this;
}

我想知道这是否正确或函数的正确实现是什么,所以我可以使用级联,例如

curStudent.setStudentNum().setMajor()......

我在做什么正确?如果是这样,我的基类应该返回什么?IE

return *(new Undergrad(....));

编辑 要回答一些问题,我只需要一个包含两个类 Grad 和 UnderGrad 的链表,它们都是派生形式的学生,为了对这些列表进行排序,除此之外,我需要访问派生类(唯一变量)但是我有他们强制转换为学生(根据作业的要求),因此为了访问任何班级特定的数据,我需要编写一些虚拟方法来访问它(是的,在我看来这似乎没用,我可以在一个班级的学生中做所有我能做到的事情在这 3 个中,但我不能有 1 个类),因此我编写虚拟方法以专门用于派生类以访问否则会“超出我的能力范围”的变量,这会是错误的吗?接下来,Undergrad 的构造函数确实设置了专业,但是如果我想编辑任何数据,让所有旧数据删除旧节点似乎是多余的,然后用旧数据和新专业创建一个新节点

克里斯在下面的评论中的回答我认为我需要什么

4

1 回答 1

1

对我来说,听起来你的基类是一个Abstract Class. 换句话说,你永远不会实例化一个 type 类Student,它只是一种抽象和代码共享机制。

在 C++ 中没有关键字 forabstract就像在其他 OO 语言中一样,如C#, Java. 但是您可以通过将函数标记为 来实现抽象机制pure virtual。为此,只需将虚函数设置为 0,如

virtual UnderGrad& setMajor(std::string) = 0;

现在,如果任何派生类未覆盖此函数,您将收到编译器错误。这提供了一个合同,上面写着“任何派生学生,必须实施setMajor”。因此,Student该类将不会实现此函数并且不会返回任何内容,因为该函数是abstractor pure virtual

至于

curStudent.setStudentNum().setMajor()......

我不知道如何setStudentNum返回一个学生类型的对象。您可能希望将它们分成两个单独的调用。例如

curStudent.setStudentNum(2058937);
curStudent.setMajor("Computer Science");
于 2013-04-01T21:54:49.437 回答