C++ 如何使用继承

C++ 如何使用继承,c++,class,oop,inheritance,C++,Class,Oop,Inheritance,我正在研究下面的问题。但却无法得到任何健康的逻辑 1.学生人数众多。对于每个学生卷(唯一),将存储名称。对于每个主题,将存储主题代码和名称。学生可以选择科目的数量。系统应能够维护学生列表、科目列表,并能够回答:i)哪个学生选择了哪些科目,ii)哪个科目是学生 我试过一些逻辑,但现在我迷路了。有人能告诉我怎么做吗。 我是否以正确的方式处理它,或者你能建议的任何其他好的方法 #include <iostream> #include <string.h> class Stude

我正在研究下面的问题。但却无法得到任何健康的逻辑

1.学生人数众多。对于每个学生卷(唯一),将存储名称。对于每个主题,将存储主题代码和名称。学生可以选择科目的数量。系统应能够维护学生列表、科目列表,并能够回答:i)哪个学生选择了哪些科目,ii)哪个科目是学生

我试过一些逻辑,但现在我迷路了。有人能告诉我怎么做吗。 我是否以正确的方式处理它,或者你能建议的任何其他好的方法

#include <iostream>
#include <string.h>
class StudentDetails {
public:
    int roll;
    char name1[15];
};
class SubjectDetails : public StudentDetails {
public:
    SubjectDetails() = default;
    SubjectDetails(int n, string naam)
        : code(n)
        , name(naam)
    {
    }
    int code;
    string name2;
};
class Subject {
    SubjectDetails s1{ 1, "A" };
    SubjectDetails s2{ 2, "B" };
    SubjectDetails s3{ 3, "C" };
    SubjectDetails s4{ 4, "D" };
    SubjectDetails s5{ 5, "E" };
};
class Student {
public:
    Subject s[5]
};
#包括
#包括
班级学生详情{
公众:
整流罩;
字符名称1[15];
};
课程主题详细信息:公共学生详细信息{
公众:
SubjectDetails()=默认值;
SubjectDetails(int n,字符串naam)
:代码(n)
,姓名(naam)
{
}
int代码;
字符串名称2;
};
班级科目{
主题细节s1{1,“A”};
主题细节s2{2,“B”};
主题细节s3{3,“C”};
受试者详细信息s4{4,“D};
受试者详细信息s5{5,“E};
};
班级学生{
公众:
主题s[5]
};

您可能会遇到问题,因为这不是使用继承的好方法。Inrheritance在两个对象之间建立了一个连接

建议阅读:

在这种情况下,
SubjectDetails
是一个
StudentDetails
,必须可以在任何使用
StudentDetails
的地方使用。如果您有一个
StudentDetails
列表,继承说您可以在其中插入
SubjectDetails

你想要的是一个。一个学生有一门学科。一个主体有一个名字。一个主题有一个代码。在您的情况下,主题可以有许多名称和代码。根据问题中的问题描述

对于每个主题,将存储主题代码和名称

我认为这没有道理。我建议删除
SubjectDetails
并将其合并到
Subject
中。请注意,任何时候当您发现自己制作顺序编号的变量时,您可能真的需要一个数组

class Subject {
public:
    Subject() = default;
    Subject(int n, string naam)
        : code(n)
        , name(naam)
    {
    }
    int code;
    string name;
};
同样,学生可能有很多名字,但应该只有一个卷。姓名通常根据文化规范(例如,John Jacob Jingleheimer Shmidt,将姓名组合成一个更大的名称)进行堆叠,因此
StudentDetails
也应被卷进
Student
并丢弃

class Student {
public:
    int roll;
    char name1[15];
    int number_subjects;
    Subject subjects[5]; // use descriptive names. s tells you nothing about the purpose 
                         // of the member, and this often slows debugging and reading
};
现在学生们有了卷轴、名字和多达五门科目。如果指定的对象的最大数量未知,并且<代码>向量< /代码>允许在赋值中使用,请考虑使用<代码> STD::vector < /代码>而不是数组。它使跟踪动态主题列表变得更加容易

找到每个学生的科目很容易
Student
object直接告诉您
subjects
成员

要找到某一学科的学生,你必须做一些工作。您可以在学生列表中搜索包含给定
主题
的所有
学生
,这是一项简单但缓慢的任务,或者维护第二个列表,将
主题
映射到
学生
列表。映射表使得查找速度非常快,但是在添加和删除学生和科目时维护映射表的完整性可能非常困难


选择哪一个取决于预期的访问模式(如果按科目查找学生是常见的,而添加学生和科目不是常见的,则维护额外的科目->学生映射可能是一个重要的优化)、可用资源量以及完成作业所剩的时间

你为什么要使用继承?我还能做什么。有什么想法吗?经验法则:继承遵循“is-A”关系,合成(包含)遵循“has-A”规则。例如,
学生
有一个名字;
Student
不是名称,因此
Student
包含名称成员,并且不继承名称类。请使用
std::string
。它可以动态增长。字符数组是固定长度的,通常太大或太小。您必须重新分配阵列以使其更大。与数组和
std::vector
类似,有许多方法可以组织数据。例如,您可以根据需要制作单独的表。