C++ 我可以有一个子类的子类吗?如何在没有错误的情况下继承父类和其他子类的特征?

C++ 我可以有一个子类的子类吗?如何在没有错误的情况下继承父类和其他子类的特征?,c++,inheritance,C++,Inheritance,下面是一些我正在实践继承的代码,我创建了一个employee类,以及它下面的几个子类。它们各自都按照预期进行,但当我有律师和harvardLawyer时,我希望harvardLawyer有一个不同的构造函数,不同于律师的构造函数变量、小时数、薪水等,但在本例中,其他所有内容保持不变,只是sue方法相同 现在,我想继承它,而不是复制该方法。我试过多种方法 经过几次编辑 错误:没有用于初始化的匹配构造函数 “律师” 我如何解决这个问题 #include <iostream> #inclu

下面是一些我正在实践继承的代码,我创建了一个employee类,以及它下面的几个子类。它们各自都按照预期进行,但当我有律师和harvardLawyer时,我希望harvardLawyer有一个不同的构造函数,不同于律师的构造函数变量、小时数、薪水等,但在本例中,其他所有内容保持不变,只是sue方法相同

现在,我想继承它,而不是复制该方法。我试过多种方法

经过几次编辑

错误:没有用于初始化的匹配构造函数 “律师”

我如何解决这个问题

#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;
}
在harvardLawyer构造函数中,尝试调用lawyerint、double、int、string构造函数。但是,您的律师类只有一个律师构造函数。您试图调用一个不存在的函数

为了解决眼前的问题,您应该修改您的律师构造函数,以获取您试图传递给它的所有参数。您仍然可以指定默认参数-这允许您按所示顺序使用零、一、二、三或四个参数调用构造函数。你的选择

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,只需创建一个律师并传递适当的参数。假设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";
}
在harvardLawyer构造函数中,尝试调用lawyerint、double、int、string构造函数。但是,您的律师类只有一个律师构造函数。您试图调用一个不存在的函数

为了解决眼前的问题,您应该修改您的律师构造函数,以获取您试图传递给它的所有参数。您仍然可以指定默认参数-这允许您按所示顺序使用零、一、二、三或四个参数调用构造函数。你的选择

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,只需创建一个律师并传递适当的参数。假设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";
}

您需要重用基类的构造函数。律师类中唯一的构造函数与harvardLawyer尝试使用的任何构造函数都不匹配。在C++的旧版本中,您必须使代理构造函数达到相同的效果,但现在使用简单::将执行。

它引入了所有的构造函数。汉迪

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!"; }
};

您需要重用基类的构造函数。律师类中唯一的构造函数与harvardLawyer尝试使用的任何构造函数都不匹配。在C++的旧版本中,您必须使代理构造函数达到相同的效果,但现在使用简单::将执行。

它引入了所有的构造函数。汉迪

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!"; }
};

@John,例如,如果我使用多重继承并创建一个主函数,在其中调用harvardLawyer类型的变量,那么我对它使用getHours方法,我在“employee”类型的多个基类子对象中发现了非静态成员“getHours”错误:class harvardLawyer->class employee class harvardLawyer->class lawyer->class lawyer->classemployee@John例如,如果我使用多重继承并创建一个main函数,在其中调用类型为harvardLawyer的变量,然后我对它使用getHours方法,我在多个类型为“employee”的基类子对象中找到了错误非静态成员“getHours”:class harvardLawyer->class employee class harvardLawyer->class lawyer->class employee->class employee,因此律师构造函数中的无用数据实际上并不存在,最初,这行代码只是律师:Employee8030000.0,15,pinkNow在这一点上一切都正常,但是如果我在问题的代码中取消注释d.sue,我会得到一个错误,在“harvardLawyer”中没有名为“sue”的成员,就好像它不是从employee类继承的一样,不管以前有没有什么,你想要什么样的界面?有几种方法可以做到这一点,但这取决于您希望外部接口的外观。再一次,我认为律师应该有一个字符串成员,叫做university或者其他什么来区分律师和harvardLawyer。律师中那个古怪的构造器和harvardLawyer类:public employee,public lawyer是我试图找到一个解决我刚才提到的错误的方法。我在原来的问题中修改了它,这样你就可以更好地看到它之前是怎样的happened@Jad如果harvardLawyer只从雇员那里继承,那么它就不会有sue。sue来自律师。因此律师构造函数中的无用数据实际上并不存在,最初这行只是律师:Employee8030000.0,15,pinkNow在这一点上一切正常,但如果我取消注释d.sue,可以在问题代码中看到,我会得到一个错误s
在“harvardLawyer”中没有名为“sue”的成员,就好像它不是从employee类继承的一样。不管以前有没有什么,你想要的接口是什么?有几种方法可以做到这一点,但这取决于您希望外部接口的外观。再一次,我认为律师应该有一个字符串成员,叫做university或者其他什么来区分律师和harvardLawyer。律师中那个古怪的构造器和harvardLawyer类:public employee,public lawyer是我试图找到一个解决我刚才提到的错误的方法。我在原来的问题中修改了它,这样你就可以更好地看到它之前是怎样的happened@Jad如果harvardLawyer只从雇员那里继承,那么它就不会有sue。sue来自律师。看起来你的想法是对的,我没有这样想,但似乎你不能对构造函数使用using声明错误:using声明不能引用使用employee::employee的构造函数@JadMoussa添加了demo-我只使用employee::employee添加了demo;对你的代码来说,这很奇怪,演示对我来说也很有用。可能是我使用的编译器吗?@JadMoussa可能是,但如果是这样,你可能会使用c++11之前的编译器,这在今天并不常见,但确实发生了。看起来你的想法是对的,我没有那样想,但似乎不能对构造函数使用using声明错误:using声明不能引用使用employee::employee的构造函数@JadMoussa添加了demo-我只使用employee::employee添加了demo;对你的代码来说,这很奇怪,演示对我来说也很有用。它可能是我正在使用的编译器吗?@JadMoussa可能是,但如果是这样的话,你可能正在使用一个c++11之前的编译器,这在今天是不寻常的,但确实发生了。