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

Cannot inherit data from parent class to child class in C++

本文关键字:C++ 子类 继承 父类 数据      更新时间:2023-10-16

我正在尝试将数据从员工学生的两个父类继承到经理的子类。我已经创建了每个类的 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 个不同的对象,每个对象都包含自己的数据!

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

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 函数,因此最好现在private成员变量

。顺便说一句:main 的返回值通常0以表明没有错误。如果要返回"无错误",只需省略 return 语句即可。 默认情况下,main()将返回 0。

以下行创建三个对象。

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

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

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

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

  1. 删除 emp 和 stu 的分配;
  2. 将 setter 调用中的 EMP 和 STU 变量名称更改为 Man。
  3. 在经理声明中保护为公共的更改,其中经理扩展学生和员工。

    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;
    

    }

你会得到我假设你期望的输出。