多继承的使用
#include <iostream>
#include <string>
class Person
{
public:
Person(std::string theName);
void introduced();
protected:
std::string name;
};
class Teacher:public Person
{
public:
Teacher(std::string theName,std::string theClass);
void teach();
//void introduced();
protected:
std::string classes;
};
class Student:public Person
{
public:
Student(std::string theName,std::string theClass);
void attendClass();
void introduced();
protected:
std::string classes;
};
class TeachingStudent:public Student,public Teacher //多继承
{
public:
TeachingStudent(std::string theName,std::string classTeaching,std::string classAttending);
void introduced();
};
Person::Person(std::string theName)
{
name=theName;
}
void Person::introduced()
{
std::cout<<"大家好,我是"<<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::introduced()
{
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::introduced()
{
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::introduced()
{
std::cout<<"大家好,我是"<<Student::name<<",我教"<<Teacher::classes<<",";
std::cout<<"同时我在"<<Student::classes<<"学习. \n\n";
}
int main()
{
Teacher teacher("小甲鱼","C++入门班");
Student student("迷途羔羊","C++入门班");
TeachingStudent teachingStudent("丁丁","C++入门班","C++进阶班");
//深入考虑,既然在TechingStudent对象里可以继承两个不同的class属性,那它是应该有两个不同的name属性呢?
teacher.introduced();
teacher.teach();
student.introduced();
student.attendClass();
teachingStudent.introduced();
teachingStudent.teach();
teachingStudent.attendClass();
return 0;
}
执行结果:
一点复习:关于重载
如果想实现重载,即另外在子类中声明,并写出具体的实现函数,假如这个函数的内部为空,则不会做出任何动作,
也不会做出基类的实现方法。如果没有重载(没有在子类里声明),则相当于子类继承了基类的方法。
上述留下的问题代码修改==虚继承的使用
class Teacher:virtual public Person
{
public:
Teacher(std::string theName,std::string theClass);
void teach();
void introduced();
protected:
std::string classes;
};
class Student:virtual public Person
{
public:
Student(std::string theName,std::string theClass);
void attendClass();
void introduced();
protected:
std::string classes;
};
TeachingStudent::TeachingStudent(std::string theName,
std::string classTeaching,
std::string classAttending)
:Teacher(theName,classTeaching),Student(theName,classAttending),Person(theName)
{
} //直接继承