как вызвать дочерний класс внутри его родительского класса?

#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>
{
    .....
}