在面向对象对象程序设计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;
}
运行结果:
不通过继承和派生可以实现上面的功能,但是存在的问题: