c ++与派生类成员级联

时间:2013-04-01 21:48:21

标签: c++ polymorphism

注意:这是家庭作业!

我正在开展一个大型项目,其中我有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的构造函数设置了主要但是如果我想要编辑任何数据似乎是多余的,以使所有旧数据删除旧节点,然后创建一个包含旧数据和新主要的新节点

克里斯在下面的评论中回答了我需要的确切内容

1 个答案:

答案 0 :(得分:1)

听起来你的基类是Abstract Class。换句话说,你从不实例化类型Student的类,它只是一个抽象和代码共享的机制。

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

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

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

至于

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

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

curStudent.setStudentNum(2058937);
curStudent.setMajor("Computer Science");