case5:继承和派生的作用举例_1.0版本(不使用继承)

在面向对象对象程序设计C++的书中有这样一个案例:

               

(1)我们通过Student类和Teacher类,不使用继承来实现上面的功能:

(1) main.cpp

/************************************************************************
* Object-Oriented Programming C++        
* @title School 1.0
* @author Haoaowei
*Email:aowei_hao@126.com
*
************************************************************************/

#include "teacher.h"
#include "student.h"

int main()
{
	Teacher ta("TA");   //调用Teacher类
	Teacher tb("TB");
	Student s1("S1",2005); //初始化类Student
	Student s2("S2",2006);

	ta.teach("C++");   //类Teacher中的成员函数
	tb.teach("英语");

	s1.learn("C++");   //学生学习
    s2.learn("英语");

	tb.talk(ta,"请你吃饭去啊");   //老师类之间的通信
	ta.talk(tb,"好啊");
	s2.talk(s1,"我想去");        //学生类之间的通信
	s1.talk(s2,"我也想去");

	ta.talk(s1,"一起去吧");    //通过函数的重载实现
	tb.talk(s2,"你先回家做作业");

	ta.eat("包子");   //类Teacher中的成员函数
	tb.eat("饺子");
	s1.eat("豆浆");//类Student中的成员函数

	s2.doHomework("英语");  //类Student的函数
	
	return 0;
}

(2)  student.h

#ifndef STUDENT_H_INCLUDED
#define  STUDENT_H_INCLUDED

#include "string"
using std::string;
class Student
{
public:
	Student( string name="hao",int grade=2011); //构造函数
	~Student(){};//析构函数
	//成员函数
	string getName() const {return name;}  //类外获取私有成员
    void learn(string course);
	void talk(Student S,string stm);
	void eat(string food);
	void doHomework(string course);
private:
	string name;
	int grade;
};

#endif

(3) student.cpp

#include "student.h"
#include "iostream"
using namespace std;
Student::Student( string name,int grade):name(name),grade(grade) {}//构造函数

void Student::learn(string course) //成员函数,老师教
{
	cout<<grade<<"级学生"<<name <<"学习"<<course <<endl;

}

void Student::talk(Student S,string stm)  //学生类之间的通信
{
	cout<<"学生"<<name<<"对 学生" << S.name << "说: "<< stm <<endl;

}

void Student::eat(string food)
{
	cout <<"学生"<<name<<"吃"<<food <<endl;
}

void Student::doHomework(string course)
{
	cout <<"学生"<<name<<"做"<<course <<endl;

}

(4) teacher.h

#ifndef TEACHER_H_INCLUDED
#define  TEACHER_H_INCLUDED

#include "student.h"
#include "string"
using std::string;
class Teacher
{
public:
	Teacher( string name = "hao"); //构造函数
	~Teacher(){};//析构函数
	//成员函数
	void teach(string stm);
	void talk(Teacher T,string stm);
	void talk(Student S,string stm);  //通过函数的重载
	void eat(string food);

private:
	string name;
};

#endif

(5) teacher.cpp

#include "teacher.h"
#include "iostream"
using namespace std;

Teacher::Teacher( string name):name(name) {} //构造函数

void Teacher::teach(string stm) //成员函数,老师教
{
	cout<<"教师"<<name <<"教"<<stm <<endl;

}

void Teacher::talk(Teacher T,string stm)
{
	cout <<"老师"<<name <<"对 老师"<<T.name <<"说: "<<stm<<endl;
}

void Teacher::talk(Student S,string stm)  //通过函数的重载
{
	cout <<"老师"<< name <<"对 学生"<<S.getName()<<"说: "<<stm<<endl;   //S.name 无法直接访问到
}

void Teacher::eat(string food)
{
	cout <<"老师"<<name<<"吃"<<food <<endl;
}

运行结果:

                                         

不通过继承和派生可以实现上面的功能,但是存在的问题:

               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值