people为基类,student和graduate为子类,重载“==”运算符

//people为基类,student和graduate为子类,重载“==”运算符

//输入2个学生的信息:姓名、编号、身份证号、班级、专业

//输入1个研究生的信息:姓名、编号、身份证号、班级、专业、导师

//重载“==”,当两个学生的编号相同时,调用重载运算符,输出错误信息

源代码如下:

#include <iostream>
#include <string>
using namespace std;
//定义基类
class People

{

public:
//成员变量:姓名,编号,身份证号
  string name;
  string number;
  string id_number;

public:
  People() {} //无参数的构造函数
  People(string name1,string number1,string id_number1){
  name = name1;
  number = number1;
  id_number = id_number1;
}
//声明input,,output,类外定义
void input();
void output();
};
//定义基类的成员函数input()
void People:: input()

{
  //输入姓名,编号,身份证号
  cin >> name;
  cin >> number;
  cin >> id_number;
}
//定义基类的成员函数output()
void People:: output()

{
  //输出姓名,编号,身份证号
  cout << " name : " << name;
  cout << " number : " << number;
  cout << " id_number : " << id_number;
}

//子类student
class Student:public People

{
  //成员变量班级,专业
public:
  string Class;
  string major;
public:
  Student(){}
  Student(string name1,string number1,string id_number1,string Class1,string major1):People(name1,number1,id_number1){
  Class = Class1;
  major = major1;
}
void input();

void output();
bool operator ==(const Student &);

};
//子类的成员函数中,调用基类的成员函数input()
void Student::input()

{
  People::input();
  //输入班级专业
  cin>>Class>>major;
}
void Student::output()

{
  People::output();
  //输出班级专业
  cout << " Class : "<< Class;
  cout << " major : "<< major<<endl;

}
//运算符“==”重载
bool Student::operator ==(const Student &s)

{

  if(number ==s.number)

  {
    cout<<"两个学生编号相同,不合法!";
    exit(1);
  }

  else

  {
    return 1;
  }
}

//子类Graduate(研究生)
class Graduate:public Student

{
public:
  string daoshi;
public:
  Graduate(){}
  Graduate(string name1,string number1,string id_number1,string Class1,string major1,string daoshi1):Student(name1,number1,id_number1,Class1,major1)
  {
    daoshi = daoshi1;
  }
  void input();
  void output();
};

void Graduate::input()

{
  Student::input();
  cin >>daoshi;
}
void Graduate::output()

{
  Student::output();
  cout<<" daoshi : "<<daoshi<<endl;
}

int main()
{
  Student s1;
  Student s2;
  Graduate g;
  cout<<" please input the student info : "<<endl;
  s1.input();
  cout<<" please input the student info : "<<endl;
  s2.input();
  s1==s2; //调用“==”重载,判断两个学生的编号是否相同
  cout<<" please input the graduate info: "<<endl;
  g.input();
  cout<<" please show the students info:"<<endl;
  s1.output();
  s2.output();
  cout<<" show the graduate info: "<<endl;
  g.output();
  return 1;
}

运行结果:

原文地址:https://www.cnblogs.com/duanqibo/p/11102078.html

时间: 2024-10-07 01:29:25

people为基类,student和graduate为子类,重载“==”运算符的相关文章

派生类地址比基类地址少4(子类与基类指针强行转换的时候,值居然会发生变化,不知道Delphi BCB是不是也这样) good

大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree是最底层基类(非虚类), CSamplerTree(虚类)派生自CTree,CMSamplerTree,CASamplerTree派生自CSamplerTree,                                                         CTree中包括两个成员

C++中虚基类

摘自<C++程序设计> 如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员. C++提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员. 下面举例说明: 在如下的图中: Person类是Student和Teacher的基类,而Graduate类又继承自Student和Teacher类. 如果使用虚基类的话,Graduate将有两份age拷贝,两份gender拷贝,两份name

C++派生类与基类的转换规则

基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,具体表现在以下几个方面,需要的朋友可以参考下 只有公用派生类才是基类真正的子类型,它完整地继承了基类的功能.基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其子类对象代替. 具体表现在以下几个方面: 派生类对象可以向基类对象赋值. 可以用子类(即公用派生类)对象对其基类对象赋值.如 A a1; //定义基类A对象a1 B b1; //定义类A的公

详解C++中基类与派生类的转换以及虚基类

很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生

winfrom 基类窗体与子类窗体load事件详解

今日在写代码时,需要在子窗体运行时调用基类窗体中的load事件,顺带将该部分功能做一个详细的了解. Winform窗体在初始化到呈现在用户眼前会依次经历三个阶段,构造-加载-显示,分别对应.NET 窗体中的 InitializeComponent,onLoad,show三个调用函数,以下: InitializeComponent:初始化窗体及窗体上的控件,加载并分配资源,注册相关事件 onLoad:注册装载窗口事件,是窗体启动时调用该函数,触发formload事件,从而调用From_Load事件

为什么基类的析构函数是虚函数?

1.第一段代码 #include<iostream> using namespace std; class ClxBase{ public: ClxBase() {}; ~ClxBase() { cout << "Output from the destructor of class ClxBase!" << endl; }; void DoSomething() { cout << "Do something in class

C++获取基类指针所指子类对象的类名

我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 关键字 typeid,有关此关键字的详细内容请自行百度. 代码: 1 #include <iostream> 2 #include <string> 3 #include <typeinfo> 4 using namespace std; 5 6 class father 7 { 8 publi

C++ 基类指针,子类指针,多态

基类指针和子类指针之间相互赋值(1)将子类指针赋值给基类指针时,不需要进行强制类型转换,C++编译器将自动进行类型转换.因为子类对象也是一个基类对象. (2)将基类指针赋值给子类指针时,需要进行强制类型转换,C++编译器将不自动进行类型转换.因为基类对象不是一个子类对象.子类对象的自增部分是基类不具有的.(强制转换告诉编译器为对象增加子类所特有的部分) fish* fh1;  animal* an1 = new animal; fh1 = (fish*)an1; 原理: 当我们构造fish类的对

构造函数为什么不能为虚函数 &amp;amp; 基类的析构函数为什么要为虚函数

一.构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的.问题出来了,假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数. 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到相应的调用.构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀.所以构造函数没有必要是虚