类的继承与派生
热身:
例:
设计一个Person类,代表一个人的基本属性,再设计一个学生类Student,继承Person类,增加学生学号的属性。输出学生信息。
#include#include
using namespace std;
class Person
{
private:
string name;
string sex;
int age;
public:
Person() {}
Person(string,string,int);
void disPlay();
}; //Person基类,有name,sex,age属性
class Student:private Person
{
private:
int num;
Person teacher; //在派生类中有子对象
public:
Student() {}
Student(string,string,int,int ,string ,string,int);
void disPlay1();
void disPlayTeacher()
{
cout<<"teacher"<
cout<
}; //Student派生类,新增num学号属性
void Person::disPlay()
{
cout<<"name="<
Person::Person(string name,string sex,int age)
{
this->name = name;
this->sex = sex;
this->age = age;
}
Student::Student(string name1,string sex1,int age1,int num,string name2,string sex2,int age2):
Person(name1,sex1,age1),teacher(name2,sex2,age2 )
{
this->num = num;
} //派生类的构造函数格式(注意基类和子对象)
void Student::disPlay1()
{
cout<<"student"<
cout<<"num="<
int main()
{
Student st("huahua","girl",19,121205,"fangfang","boy",20);
st.disPlay1();
st.disPlayTeacher(); //输出学生信息
return 0;
}
类的继承:一个新类从已有的类那里获得其已有的特性。
类的派生:已有的类(父类)产生一个新的子类。
单继承:一个派生类只有一个基类。
多继承:一个派生类有两个或多个基类。
形式:
class 派生类名: [继承方式] 基类名
{
派生类增加成员;
};
(1).派生类把基类全部成员,不包括构造函数和析构函数。
(2).调整从基类接收的成员。派生类中声明一个与基类成员同名的成员,则派生类中的新成员则会覆盖基类同名成员。如果是成员函数,则应函数名函数类型参数个数相同。
(3).派生类继承了基类的所有有数据成员和成员函数,并可对成员作必要的增加或调整。
(4).基类的成员函数只能访问基类成员,不能访问派生类成员。
(5).继承方式:
公用继承:(public)基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。
私有继承:(private)基类的公有成员在派生类中成了私有成员,基类私有成员仍为基类私有。
受保护继承:(protected)基类公用成员和受保护成员在派生类中成了保护成员。(保护成员:不能被外界引用,但可以被派生类的成员引用)
(6).派生类:一部分从基类继承过来,另一部分派生类新增成员。
多级派生时的访问属性
class A { …… }
class B : public A { …… }
class C : protect B { …… }
多级派生,如果都采用公用或受保护方式,最后一级可访问最初基类。如果是私有继承,经过多级后成员或被外界不能访问。
派生类的构造函数和析构函数
构造函数:
派生类构造函数名 (总参数列表):基类构造函数名 (参数列表)
{派生类中新增数据成员初始化语句}
例:
Student::Student(string name,string sex,int age,int num):Person(name,sex,age)
{
this->num = num;
}
析构函数:
即为派生类名前加~,因为不能继承基类的构造函数和析构函数。
有子对象的派生类的构造函数
例:
Student::Student(string name1,string sex1,int age1,int num,string name2,string sex2,int age2):
Person(name1,sex1,age1),teacher(name2,sex2,age2 )
{
this->num = num;
} //派生类的构造函数格式(注意基类和子对象)
多重继承
派生类D,同时继承了A,B,C类
class D:public A,private B,protected C
{ ……}
多重继承派生类的构造函数
派生类构造函数名 (总参数表) :基类1构造函数(参数列表),基类2构造函数(参数列表),基类3构造函数(参数列表)
{ 派生类中新增数据成员初始化 }
多重继承引起的二义性问题
例:
class A
{
public:
int a;
void display();
};
class B
{
public:
int a;
void display();
};
class C:public A,public B
{
public:
int b;
void show();
};
如果定义C的对象c,当调用c.display()时,不能确定是B的还是A的,出问题了。
解决措施:当调用A类的display时,写成c.A ::display(),就会调用A类的函数display。
虚基类
例。Teacher类和Student类的共同基类是Person,Graduate共同继承了Teacher类和Student类,建立一个Graduate对象,输出对象信息
#include
#include
using namespace std;
//声明公共类
class Person
{
protected: // 保护成员
string name;
string sex;
int age;
public:
Person(string name,string sex,int age) // 构造函数
{
this->name = name;
this->sex = sex;
this->age = age;
}
};
//声明Person的直接派生类Teacher
class Teacher:virtual public Person // 声明Person为公用继承的虚基类
{
protected:
string title;
public:
Teacher(string name,string sex,int age,string title):Person(name,sex,age)
{
this->title = title;
}
};
// 声明Person的直接派生类Student
class Student:virtual public Person //声明Person为公