无法将数据从父类继承到C++中的子类
Cannot inherit data from parent class to child class in C++
我正在尝试将数据从员工和学生的两个父类继承到经理的子类。我已经创建了每个类的 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
对象与man
的Employee
子对象无关,stu
对象与man
的Student
子对象无关。
线条
emp.set_name("Fahad");
emp.set_number(10);
更改独立emp
对象的状态。它们不会更改man
的Employee
子对象的状态。
您需要使用:
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 {
...
};
您的代码无法按预期工作,因为:
- 您可以为每个员工、学生和经理分配单独的对象/实例,例如 emp、stud 和 man,并在每个单独的实例上设置数据(例如,emp.set_name(( 只会影响 emp 对象,而不会影响 man 对象(。
- 打印 man 对象的数据成员,该成员不包括 emp 和 man 中的数据集。
我不知道您的代码设计背后的想法是什么,我建议省略多重继承,因为它很快就会导致代码无法维护。但是,要使示例代码正常工作,请执行以下操作:
- 删除 emp 和 stu 的分配;
- 将 setter 调用中的 EMP 和 STU 变量名称更改为 Man。
-
在经理声明中保护为公共的更改,其中经理扩展学生和员工。
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;
}
你会得到我假设你期望的输出。
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类