【问题标题】:Cannot inherit data from parent class to child class in C++无法在 C++ 中将数据从父类继承到子类
【发布时间】:2019-10-21 17:34:19
【问题描述】:

我正在尝试将 EmployeeStudent 这两个父类的数据继承到Manager。我已经创建了每个类的 set 和 get 函数,并且我在子类中创建了一个 show 函数,它也将显示两个父类的数据。但是当我制作设置值的对象和调用函数然后显示数据,仅显示子类的数据。 谁能告诉我为什么会这样,我该如何解决?感谢您的帮助。

代码如下:

class Employee{
protected:
    string name;
    int number;
public:
    Employee(){
        name = "";
        number = 0;
    }
    void set_name(string a){
        name = a;
    }
    void set_number(int a){
        number = a;
    }
    string get_name(){
        return name;
    }
    int get_number(){
        return number;
    }
};

class Student{
    protected:
        string school;
        string degree;
    public:
        Student(){
            school = "";
            degree = "";
        }
        void set_school(string a){
            school = a;
        }
        void set_degree(string a){
            degree = a;
        }
        string get_school(){
            return school;
        }
        string get_degree(){
            return degree;
        }
};

class Manager:protected Employee, protected Student{
    protected:
        string title;
        int dues;
    public:
        Manager(){
            title = "";
            dues = 0;
        }
        void set_title(string a){
            title = a;
        }
        void set_dues(int a){
            dues = a;
        }
        string get_title(){
            return title;
        }
        int get_dues(){
            return dues;
        }
        void show_data(){
            cout << Employee::get_name();
            cout << Employee::get_number() << endl;
            cout << Student::get_school() << endl;
            cout << Student::get_degree() << endl;
            cout << get_title() << endl;
            cout << get_dues() << endl;
        }
};
int main(){
    Employee emp;
    Student stu;
    Manager man;
    emp.set_name("Fahad");
    emp.set_number(10);
    stu.set_school("COMSAT");
    stu.set_degree("BSCS");
    man.set_title("Manager Title");
    man.set_dues(100);
    man.show_data();
    return 1;
}

【问题讨论】:

  • 我想你这里有误会stuempman是不同类的独立实例,彼此无关。例如emp.set_name("Fahad"); 不会改变man 中的任何内容,因此不会影响输出。
  • 这并没有解决问题,但是受保护的成员和受保护的继承非常罕见。通常,数据成员是私有的,而继承是公共的。如果有充分的理由使用受保护,请务必这样做,但我在这里没有看到。
  • @PeteBecker 但是如果我在父类中将数据成员设为私有,那么我不能在子类中继承这些数据成员,或者我可以吗?
  • @Fahad -- 基类的数据成员被继承,无论它们是私有的、受保护的还是公共的。如果它们是私有的,则派生类和外部人员无法使用它们的名称 来访问它们。但是访问器函数仍然存在,它们可以用来设置和读取值。

标签: c++


【解决方案1】:

您有 3 个不同的对象,每个对象都包含自己的数据!

例如,您的经理类包含经理、员工和学生的所有属性。在您的主要功能中:

Employee emp;
Student stu;
Manager man;
emp.set_name("Fahad");
emp.set_number(10);

stu.set_school("COMSAT");
stu.set_degree("BSCS");

man.set_title("Manager Title");
man.set_dues(100);
man.show_data();

您只设置了对象的一些属性。对于经理,您只需设置头衔和会费。如果你还想设置名称,你必须这样做!

顺便说一句:如果你没有多次使用相同的属性名或多次从同一个类继承,则无需使用Student::get_school()访问父类的成员。

我相信你想做以下事情:

class Manager:public Employee, public Student{ ... };

int main(){
    Manager man;
    man.set_name("Fahad");
    man.set_number(10);
    man.set_school("COMSAT");
    man.set_degree("BSCS");
    man.set_title("Manager Title");
    man.set_dues(100);
    man.show_data();
    return 1;
}

如果您更改为public 以从您的父类派生,您可以直接从对象访问getter/setter 函数,如您所见。由于您已经拥有 getter 和 setter 函数,因此现在将成员 var 设为 private 是个好主意。

顺便说一句:main 的返回值通常是0,表示没有错误。如果你想以“没有错误”的方式返回,你可以简单地省略 return 语句。 main() 默认会返回 0。

【讨论】:

    【解决方案2】:

    以下几行创建了三个对象。

    Employee emp;
    Student stu;
    Manager man;
    

    emp 对象与manEmployee 子对象无关,stu 对象与manStudent 子对象无关。

    线条

    emp.set_name("Fahad");
    emp.set_number(10);
    

    改变独立emp对象的状态。它们不会改变manEmployee 子对象的状态。

    你需要使用:

    int main(){
        // Employee emp;   Not needed
        // Student stu;    Not needed
    
        Manager man;
        man.set_name("Fahad");
        man.set_number(10);
        man.set_school("COMSAT");
        man.set_degree("BSCS");
        man.set_title("Manager Title");
        man.set_dues(100);
        man.show_data();
        return 1;
    }
    

    查看在同一对象上设置的值。但是,要做到这一点,您需要更改Manager 的继承。使用

    class Manager : public Employee, public Student {
       ...
    };
    

    【讨论】:

      【解决方案3】:

      您的代码无法按预期工作,因为:

      1. 您为每个员工、学生和经理分配单独的对象/实例,例如emp、stud 和 man 并在每个单独的实例上设置数据(例如,emp.set_name() 只会影响 emp 对象,而不影响 man 对象)。
      2. 您打印了 man 对象的数据成员,其中不包括 emp 和 man 中的数据集。

      我不知道你的代码设计背后的想法是什么,我建议不要使用多重继承,因为它很快会导致无法维护的代码。但要让您的示例代码正常工作,请执行以下操作:

      1. 删除emp和stu的分配;
      2. 将 setter 调用中的 emp 和 stu 变量名称更改为 man。
      3. 在 Manager 声明中将更改 protected 为 public,其中 Manager 扩展 Student 和 Employee。

        class Manager:public Employee, public Student{
        
        int main(){
        Manager man;
        man.set_name("Fahad");
        man.set_number(10);
        man.set_school("COMSAT");
        man.set_degree("BSCS");
        man.set_title("Manager Title");
        man.set_dues(100);
        man.show_data();
        return 1;
        

        }

      你会得到我认为你期望的输出。

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 2013-03-03
        • 2023-04-02
        相关资源
        最近更新 更多