Как наследовать методы, а затем что-то добавить к ним? - PullRequest
0 голосов
/ 03 декабря 2018
class uni_person {
    public:
    string f_name;   // 1
    string s_name;   // 2
    int age;         // 3
    string institute;// 5
    string uni;      // 6 
    string p_number; // 7

    void addSmth() {
        int x;
        cout << "What do you want to add about the student ?\n1: first name\n2: second name\n3: age\n4: course\n5: institute\n6: university\n7: phone number\n8: group\n";
        cin >> x;
        switch (x) {
            case 1: cin >> f_name; break;
            case 2: cin >> s_name; break;
            case 3: cin >> age; break;
            case 5: cin >> institute; break;
            case 6: cin >> uni; break;
            case 7: cin >> p_number; break;
            default: cout << "Error" << endl; break;
        }
    }
};

class Student: public uni_person {
    public:
    int course;
    int group;

    void addSmth() {
        int x;
        cout << "What do you want to add about the student ?\n1: first name\n2: second name\n3: age\n4: course\n5: institute\n6: university\n7: phone number\n8: group\n";
        cin >> x;
        switch (x) {
            case 4: cin >> course; break;
            case 8: cin >> group; break;
        }
    }
};

Итак, у меня есть проблема, в настоящее время я изучаю ООП на c ++, и я пришел к этой проблеме ... Как заставить класс наследовать метод других классов и добавить что-то новое в него, не переписывая его?Для этого есть специальная функция или как?Я переписал addSmth() и хочу добавить еще поведение в addSmth ().

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Нет способа добавить еще поведение в метод, который не ожидается в C ++.Но вы можете разработать свой метод для добавления с самого начала:

class uni_person
{
public:
    string f_name;   // 1
    string s_name;   // 2
    int age;         // 3
    string institute;// 5
    string uni;      // 6
    string p_number; // 7

    void addSmth()
    {
        int x;
        cout << "What do you want to add about the student ?\n1: first name\n2: second name\n3: age\n4: course\n5: institute\n6: university\n7: phone number\n8: group\n";
        cin >> x;
        switch (x) {
            case 1: cin >> f_name; break;
            case 2: cin >> s_name; break;
            case 3: cin >> age; break;
            case 5: cin >> institute; break;
            case 6: cin >> uni; break;
            case 7: cin >> p_number; break;
            default: cout << "Error" << endl; break;
        }

        // Call additional code. Does nothing by default.
        appendix();
    }

protected:

    virtual void appendix() {}
};

class Student: public uni_person
{
public:
    int course;
    int group;

private:
    void appendix() override
    {
        // Code from your Student::addSmth().
        // Will be called at the end of uni_person::addSmth().

        int x;
        cout << "What do you want to add about the student ?\n1: first name\n2: second name\n3: age\n4: course\n5: institute\n6: university\n7: phone number\n8: group\n";
        cin >> x;
        switch (x) {
            case 4:case 4: cin >> course; break;
            case 8: cin >> group; break;
        }
    }
};

Другой дочерний класс может добавить какое-то другое поведение, которое будет вызываться правильно из-за виртуальности.

Также обратите внимание на других участниковСоветы о вашем дизайне и стиле кода.

0 голосов
/ 03 декабря 2018

Сначала вы должны отделить взаимодействие пользователя от реальной логики.Если у вас есть такая возможность, вы можете вызвать функцию Base из функции Derived явно:

Также вам, вероятно, следует отметить базовые функции virtual и производные функции override.

virtual void uni_person::promptAddSmth()
{
    cout << "What do you want to add about the student ?\n1: first name\n2: second name\n3: age\n4: course\n5: institute\n6: university\n7: phone number\n8: group\n";
    int x;
    cin >> x;
    addSmth(x);
}

virtual void uni_person::addSmth(int x)
{
    switch (x) {
    case 1: cin >> f_name; break;
    case 2: cin >> s_name; break;
    case 3: cin >> age; break;
    case 5: cin >> institute; break;
    case 6: cin >> uni; break;
    case 7: cin >> p_number; break;
    default: cout << "Error" << endl; break;
    }
}

void Student::promptAddSmth() override
{
    cout << "What do you want to add about the student ?\n1: first name\n2: second name\n3: age\n4: course\n5: institute\n6: university\n7: phone number\n8: group\n";
    int x;
    cin >> x;
    addSmth(x);
}

void Student::addSmth(int x) override
{
    switch(x) {
    case 4: cin >> course; break;
    case 8: cin >> group; break;
    default: uni_person::addSmth(x); break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...