混迹于C++之多继承和多继承

多继承的使用

www.fishc.cm

#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)
{

}  //直接继承


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值