我正在尝试从 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;
}
答案 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)
您的代码无法正常工作,因为:
我不知道您的代码设计背后的思想是什么,我建议您不要使用多重继承,因为它会很快导致无法维护的代码。但是,要使示例代码正常工作,请执行以下操作:
在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;
}
您将获得我想像的输出。