无法在C ++中从父类到子类继承数据

时间:2019-10-21 17:34:19

标签: c++

我正在尝试从 Employee Student 的两个父类继承数据到 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;
}

3 个答案:

答案 0 :(得分:3)

您有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函数,所以现在使成员vars为private是个好主意。

BTW:main的返回值通常为0,以指示没有错误。如果要返回“没有错误”,则可以简单地省略return语句。 main()默认会返回0。

答案 1 :(得分:1)

以下几行创建三个对象。

Employee emp;
Student stu;
Manager man;

emp对象与Employee的{​​{1}}子对象无关,并且man对象与stu的子对象无关的Student

线条

man

更改独立emp.set_name("Fahad"); emp.set_number(10); 对象的状态。它们不会更改emp的{​​{1}}子对象的状态。

您需要使用:

Employee

查看在同一对象上设置的值。但是,为此,您需要更改man的继承。使用

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

答案 2 :(得分:1)

您的代码无法正常工作,因为:

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

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

  1. 删除emp和stu的分配;
  2. 在对man的setter调用中更改emp和stu变量名称。
  3. 在Manager声明中,保护更改为公开,经理声明中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;
    

    }

您将获得我想像的输出。