#include <iostream> #include <string> #include <cstdio> using namespace std; class Person { public: string name,addr,tel; int age; char sex; Person( string name_,int age_,char sex_,string addr_,string tel_ ) :name(name_),age(age_),sex(sex_),addr(addr_),tel(tel_){ } virtual void setTel(string newTel){ tel=newTel; } virtual void setAddr(string newAddr){ addr=newAddr; } }; class Student:public Person { public: string major; Student( string name_,int age_,char sex_,string addr_,string tel_,string major_ ) :Person( name_,age_,sex_,addr_,tel_ ),major(major_){} }; class Cadre:public Person { public: string post; Cadre( string name_,int age_,char sex_,string addr_,string tel_,string post_ ) :Person( name_,age_,sex_,addr_,tel_ ),post(post_){} }; class Student_Cadre:public Student,public Cadre { public: float wage; Student_Cadre( string name_,int age_,char sex_,string addr_,string tel_,string major_,string post_,float wage_ ) :Student( name_, age_, sex_, addr_, tel_, major_ ), Cadre( name_, age_, sex_, addr_, tel_, major_, post_),wage(wage_){} void display() { cout<<"name:"<<name<<endl; cout<<"age"<<age<<endl; cout<<"sex:"<<sex<<endl; cout<<"address:"<<addr<<endl; cout<<"tel:"<<tel<<endl; cout<<"major:"<<major<<endl; cout<<"post:"<<post<<endl; cout<<"wages:"<<wage<<endl; } }; int main( ) { string name, major, post, addr, tel; int age; char sex; float wage; cin>>name>>age>>sex>>addr>>tel>>major>>post>>wage; Student_Cadre st_ca(name, age, sex, addr, tel, major, post,wage); st_ca.display( ); cout<<endl; string newAddr, newTel1, newTel2; cin>>newAddr>>newTel1>>newTel2; // st_ca.setAddr(newAddr); // st_ca.Student::setTel(newTel1); // st_ca.Cadre::setTel(newTel2); st_ca.display( ); return 0; }
时间: 2024-04-27 19:22:27 浏览: 182
这是一个 C++ 程序,包含了多重继承和虚函数的使用。
程序中定义了一个 `Person` 类,包含了个人的基本信息;`Student` 类和 `Cadre` 类分别继承了 `Person` 类,表示学生和干部的信息;`Student_Cadre` 类同时继承了 `Student` 类和 `Cadre` 类,表示既是学生又是干部的人的信息,同时增加了一个 `wage` 成员变量表示工资。
在 `main` 函数中,首先输入一个学生干部的信息,然后调用 `display` 函数输出该人的信息。接着输入一个新的地址和两个新的电话号码,将这些新的信息设置给该人,并再次调用 `display` 函数输出该人更新后的信息。
需要注意的是,在 `Person` 类中定义了虚函数 `setTel` 和 `setAddr`,在 `Student_Cadre` 类中没有覆盖这些虚函数,因此需要通过类名限定的方式来调用 `Student` 类和 `Cadre` 类中的这些函数。具体来说,可以将注释去掉,将 `main` 函数中的三行代码取消注释即可。
相关问题
#include<iostream> #include<cstdio> using namespace std;是什么意思
#include<iostream> #include<cstdio> using namespace std; 是C++中的预处理指令,用于引入头文件和命名空间。
1. #include<iostream> 是引入iostream头文件,其中包含了输入输出流的定义,例如cout和cin等。
2. #include<cstdio> 是引入cstdio头文件,其中包含了C语言标准输入输出函数的定义,例如printf和scanf等。
3. using namespace std; 是使用std命名空间,std是C++标准库的命名空间,其中包含了很多常用的函数和类。
这些预处理指令的作用是为了在程序中能够使用输入输出流和标准库函数,使得程序更加方便和简洁。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; class STRING{ char* pstr; public: STRING(const char* s="");//已实现 ~STRING();//已实现 friend istream& operator>>(istream& in, STRING& s); friend ostream& operator<<(ostream& os, const STRING& s); }; int main() { STRING s; cin >> s; cout << s << endl; return 0; } /* 请在这里填写答案,,你只需要实现输入输出运算符(>>、<<)的重载即可 */
可以这样实现输入输出运算符的重载:
```c++
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
class STRING{
char* pstr;
public:
STRING(const char* s="");
~STRING();
friend istream& operator>>(istream& in, STRING& s);
friend ostream& operator<<(ostream& os, const STRING& s);
};
STRING::STRING(const char* s) {
pstr = new char[strlen(s)+1];
strcpy(pstr, s);
}
STRING::~STRING() {
delete []pstr;
}
istream& operator>>(istream& in, STRING& s) {
char buffer[1024];
in.getline(buffer, 1024);
s.pstr = new char[strlen(buffer)+1];
strcpy(s.pstr, buffer);
return in;
}
ostream& operator<<(ostream& os, const STRING& s) {
os << s.pstr;
return os;
}
int main() {
STRING s;
cin >> s;
cout << s << endl;
return 0;
}
```
在输入运算符中,我们使用`getline()`函数来读取输入的字符串,然后动态分配空间并将字符串拷贝到对象的数据成员中。
在输出运算符中,我们直接输出对象的数据成员。
注意,在使用动态分配空间时,需要在析构函数中释放空间。
阅读全文