在学校里有老师和学生,他们都是人,我么应该创建一个名为 Person 的基类和两个名为 Teacher 和Student 的子类,后两者是从前者继承来的
有一部分学生还教课挣钱(助教),也就是同时存在着两个"是一个"关系,我们需要写一个 TeschingStudent 类让它同时继承 Teacher 类和 Student 类,换句话说,就是需要使用多继承。
cpp
// 基本语法:
class TeachingStudent : public Student, public Teacher
{ ... }
cpp
#include<iostream>
#include<string>
class Person //基类
{
public:
Person(std::string theName);
void introduce();
protected:
std::string name;
};
class Teacher:public Person //老师类
{
public:
Teacher(std::string theName,std::string theClass);
void teach();
void introduce();
protected:
std::string classes;
};
class Student:public Person //学生类
{
public:
Student(std::string theName,std::string theClass);
void attendClass();
void introduce();
protected:
std::string classes;
};
class TeachingStudent:public Student,public Teacher //学生助教类
{
public:
TeachingStudent(std::string theName,std::string classTeaching,std::string classAttending);
void introduce();
};
Person::Person(std::string theName)
{
name=theName;
}
void Person::introduce()
{
std::cout<<"Hello,I`m"<<name<<"。\n\n";
}
Teacher::Teacher(std::string theName,std::string theClass):Person(theName)
{
classes=theClass;
}
void Teacher::teach()
{
std::cout<<name<<"教"<<classes<<"。\n\n";
}
void Teacher::introduce()
{
std::cout<<"大家好,我是"<<name<<",我教"<<classes<<"。\n\n";
}
Student::Student(std::string theName,std::string theClass):Person(theName)
{
classes=theClass;
}
void Student::attendClass()
{
std::cout<<name<<"加入"<<classes<<"学习。\n\n";
}
void Student::introduce()
{
std::cout<<"大家好,我是"<<name<<",我在"<<classes<<"学习\n\n";
}
TeachingStudent::TeachingStudent(std::string theName,std::string classTeaching,std::string classAttending): Teacher(theName,classTeaching),Student(theName,classAttending)
{
}
void TeachingStudent::introduce()
{
std::cout<<"大家好,我是"<<Student::name<<",我教"<<Teacher::classes<<",";
std::cout<<"同时我在"<<Student::classes<<"学习。\n\n";
}
int main()
{
Teacher teacher("小红","入门班");
Student student("兰兰","C++入门班");
TeachingStudent teachingStudent("茗茗","C++入门班级","C++进阶班");
teacher.introduce();
teacher.teach();
student.introduce();
student.attendClass();
teachingStudent.introduce();
teachingStudent.teach();
teachingStudent.attendClass();
return 0;
}

注意:
- 在使用多继承的时候,一定要特别注意继承了基类的多少个副本。
- 在使用多继承的时候,最安全最简明的做法是从没有任何属性且只有抽象方法的类开始继承。
- 按照上边这么做可以让你远离后代子类可能拥有好几个基类属性的问题。
- 这样的类又叫做接口( interface )。
未完待续。。。