注意:这是家庭作业!
我正在开展一个大型项目,其中我有3个(我们将重点关注)类,基类学生和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()......
我正在做什么?如果是这样我的基类应该返回什么?即。
return *(new Undergrad(....));
修改 回答一些问题 我只需要一个链接列表,其中包含2个类Grad和UnderGrad,它们都是学生派生的,为了对这些列表进行排序,除其他外我需要访问派生类(唯一变量)但是我将它们转换为学生(如因此,为了访问任何类特定数据,我需要一些虚拟方法来访问它(是的,在我看来它似乎没用,我可以在一个班级学生中做所有事情,我可以在这3个但我不能因此,如果编写虚拟方法专门用于派生类来访问变量本来是“超出我的范围”的话,那么我是不是错了,接下来Undergrad的构造函数设置了主要但是如果我想要编辑任何数据似乎是多余的,以使所有旧数据删除旧节点,然后创建一个包含旧数据和新主要的新节点
克里斯在下面的评论中回答了我需要的确切内容
答案 0 :(得分:1)
听起来你的基类是Abstract Class
。换句话说,你从不实例化类型Student
的类,它只是一个抽象和代码共享的机制。
在C ++中,abstract
没有关键字,就像C#, Java
等其他OO语言一样。但是您可以通过将函数标记为pure virtual
来实现抽象机制。为此,只需将虚函数设置为0,如
virtual UnderGrad& setMajor(std::string) = 0;
现在,如果任何派生类没有覆盖此函数,您将收到编译器错误。这提供了一个合同,上面写着“任何派出学生的人,必须实施setMajor
”。因此,Student
类不会实现此函数,并且不会返回任何内容,因为函数是abstract
或pure virtual
。
至于
curStudent.setStudentNum().setMajor()......
我不知道setStudentNum
将如何返回学生类型的对象。您可能希望将它们分成两个单独的调用。 E.g。
curStudent.setStudentNum(2058937);
curStudent.setMajor("Computer Science");