Могу ли я иметь подкласс подкласса? Как я могу наследовать характеристики родительского и другого подкласса без ошибок? - PullRequest
1 голос
/ 21 марта 2020

Итак, ниже приведен код, с которым я практикую наследование, я создаю класс сотрудников и несколько подклассов под ним. все они go, как и ожидалось, индивидуально, но когда у меня есть Lawyer и harvardLawyer , я бы хотел, чтобы harvardLawyer имел другой конструктор (переменные конструктора defrent) , часы, зарплата и т. д. c.), чем Адвокат , но все остальное (в данном случае, только sue() метод) остается тем же.

Теперь вместо того, чтобы копировать этот метод, я бы хотел унаследовать его. Я пробовал несколько способов.

После нескольких правок ...

ошибка: нет подходящего конструктора для инициализации 'lawyer'

Как мне решить это?

#include <iostream>
#include <stdio.h>
using namespace std;

class employee {
private:
    int baseHours = 40;
    double baseSalary = 40000.0;
    int baseVacationDays = 10;
    string baseVacationForm = "yellow";

public:
    employee(int hours = 40, double salary = 40000.0, int days = 10,
             string form = "yellow") {
        baseHours = hours;
        baseSalary = salary;
        baseVacationDays = days;
        baseVacationForm = form;
    }

    int getHours() { return baseHours; }
};

class lawyer : public employee {
public:
    lawyer() : employee(80, 30000.0, 15, "pink") {}

    string sue() { return "I'll see you in court!"; }
};

class harvardLawyer : public lawyer {
public:
    harvardLawyer() : lawyer(80, 36000.0, 18, "pink pink pink pink") {}
};

int main() {
    lawyer c;
    harvardLawyer d;
    cout << c.getHours() << "\n" << d.getHours() << "\n"; //<<d.sue();

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

В вашем конструкторе harvardLawyer вы пытаетесь вызвать конструктор lawyer(int, double, int, string). Однако ваш класс lawyer имеет только конструктор lawyer(). Вы пытаетесь вызвать функцию, которая не существует.

Чтобы исправить вашу непосредственную проблему, вы должны изменить конструктор lawyer так, чтобы он принимал все параметры, которые вы пытаетесь передать в него. Вы по-прежнему можете указывать параметры по умолчанию - это позволяет вам вызывать ваш конструктор с нулевым, одним, двумя, тремя или четырьмя параметрами (в указанном порядке). Ваш выбор.

class lawyer : public employee {
public:
    lawyer(int hours = 80,
           double salary = 30000.0,
           int days = 15,
           string tag = "pink") : employee(hours, salary, days, tag) {}

    string sue() { return "I'll see you in court!"; }
};

class harvardLawyer : public lawyer {
public:
    harvardLawyer() : lawyer(80, 36000.0, 18, "pink pink pink pink") {}
};

Однако не совсем понятно, зачем вам вообще нужен класс harvardLawyer. Если вы хотите harvardLawyer, просто создайте lawyer и передайте соответствующие параметры. Предполагая, что harvardLaywer больше не является классом:

int main(int argc, char** argv)
{
    lawyer regular_lawyer = lawyer();
    lawyer harvard_lawyer = lawyer(80, 36000.0, 18, "pink pink pink pink");
    std::cout << harvard_lawyer.sue() << "\n";
}
1 голос
/ 21 марта 2020

Вам необходимо повторно использовать конструктор базового класса. Единственный конструктор в вашем классе lawyer не соответствует ни одному конструктору, который harvardLawyer пытается использовать. В более старых версиях C ++ вам приходилось создавать прокси-конструкторы для достижения того же эффекта, но теперь это будет делать простой using <base-class>::<constructor>.

Он вводит всех конструкторов. Handy!

class lawyer : public employee {
public:
    using employee::employee;  //  <-  like so

    lawyer() : employee(80, 30000.0, 15, "pink") {}

    string sue() { return "I'll see you in court!"; }
};

Демо

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