#c #oop
#c #ооп
Вопрос:
class Society
{
void add_student(string name,string home_town)//add student to society
{
Student a;
a.set_name(name);
a.set_home_town(home_town);
}
bool same_community(Student s1, Student s2){}//check if student 1 amp; student 2 are in the same community
void join_communities(Student s1,Student s2){}//join communities which student 1 amp; student 2 are in
int num_of_communities(){}//return the total number of communities inside the society
float max_diversity(){}//return the highest diversity between all communities
};
class Community : public Society
{
void add(Student new_student){}//add new student to community
bool contains(string name_student){}//whether community contains a student named name_student
void join(Community other_community){}//add all students in other_community to this community
float diversity(){}//return the number of distinct hometowns/names for this community
};
class Student :public Community
{
string name, string home_town;
public:
void set_name(string a){name=a;}
void set_home_town(string b){home_town=b;}
string get_name() const{return name;}
string get_home_town() const{return home_town;}
};
У меня есть родительский класс с именем Society, и я хотел бы использовать его дочерний класс с именем Student в некоторых функциях.как я могу это сделать?
Комментарии:
1. Почему вы не делаете отступы в своем коде?
2. Базовые классы не должны знать о классах, которые являются производными от них. Когда-либо. Вместо этого найдите шаблон посетителя .
3. Кстати, каким образом Студент является своего рода сообществом? Ваше дерево наследования кажется сломанным.
4. в моем упражнении говорится, что ученик должен быть взят из сообщества одного человека
5. Я рекомендую вам прочитать об отношениях «is-a» для публичного наследования. «Эффективный C » Скотта Мейерса — хорошее место для начала.
Ответ №1:
Я согласен с другими комментариями, но при необходимости вы можете применить шаблон CRTP с этой формой. Однако это решение применимо только к сообществам учащихся, вы не можете смешивать разных членов сообщества:
template<typename T>
class Society
{
void add_student(string name,string home_town)
{
T student;
student.set_name(name);
......
}
....
};
template <typename T>
class Comunity : public Society<T>
{
void add(T new_student){}//add new student to community
....
};
class Student : public Comunity<Student>
{
.....
}