继承与派生
C++提供了类的继承机制,解决了软件重用问题。
一、概念
在C++中,所谓继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为**“基类(base class)”或“父类(father class)”;新建立的类称为“派生类(derived class)”或“子类"(son class)**。
类的继承----一个新类从已有的类那里获得其已有特征,这种现象称为类的继承。
类的派生----从另一个角度说,从已有的类(父类)产生一个新的子类,称为类的派生。
多重继承------一个派生类有两个或多个基类的称为多重继承。
基类和派生类的关系:派生类是基类的具体化,而基类则是派生类的抽象。
二、派生类的声明方式
声明派生类的一般形式为:
class 派生类名:[继承方式] 基类名
{
派生类新增加的成员
};
class Student1:public Student //以公共的方式继承,基类是Student
{
public:
void display_1() //新增加的成员函数
{
cout<<"age:"<<age<<endl;
cout<<"address:"<<addr<<endl;
}
private:
int age; //新增加的数据成员
string addr; //新增加的数据成员
};
继承方式包括;public(公用的),private(私有的)和protect(受保护的),默认为private。
三、派生类的构成
派生类中的成员包括从基类继承过来的成员和自己增加的成员两部分。
构造一个派生类包括3个部分工作:
(1)从基类接收成员;
(2)调整从基类接收的成员;
(3)在声明派生类时增加的成员。
四、派生类成员的访问属性
不同继承方式决定了基类成员在派生类中的访问属性。
(1)公用继承
基类的公用成员和受保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有;
(2)私有继承
基类的公用成员和保护成员在派生类中成了私有成员,其私有成员仍为基类私有;
(3)受保护的继承
基类的公用成员和保护成员在派生类中成了保护成员(不能被外界引用,但可以被派生类的成员引用),其私有成员仍为基类私有;
1、公用继承
用公用继承方式建立的派生类称为公用派生类,其基类称为公用基类。
公用基类的成员 | 在公用派生类中的访问属性 |
---|---|
私有成员 | 不可以访问 |
公用成员 | 公用 |
保护成员 | 保护 |
class Student //声明基类
{
public: //基类公用成员
void get_value()
{
cin>>num>>name>>sex;}
void display()
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
private: //基类私有成员
int num;
string name;
char sex;
};
class Student1:public Student //以public方式声明派生类Student1
{
public:
void display_1()
{
cout<<"num:"<<num<<endl;// 企图引用基类的私有成员,错误
cout<<"name:"<<name<<endl;// 企图引用基类的私有成员,错误
cout<<"sex:"<<sex<<endl;// 企图引用基类的私有成员,错误
cout<<"age:"<<age<<endl;//引用派生类的私有成员,正确
cout<<"address:"<<addr<<endl;//引用派生类的私有成员,正确
}
private:
int age;
string addr;
};
2、私有继承
用私有继承方式建立的派生类称为私有派生类,其基类称为私有基类。
私有基类的成员 | 在私有派生类中的访问属性 |
---|---|
私有成员 | 不可以访问 |
公用成员 | 私有 |
保护成员 | 私有 |
接上节程序:
int main()
{
Student1 stud1;//定义一个Student1
stud1.display();//错误,私有基类的公用成员函数在派生类中是私有函数
stud1.display_1();//正确。display_1()函数是Student1类的公用函数
stud1.age = 18;//错误。外界不能引用派生类的私有成员
return 0;
}
私有派生类限制太多,一般不常使用。
3、保护成员和保护继承
由protected声明的成员称为“受保护的成员”,不能被类外访问,从用户角度来看,等于与私有成员,但区别在于:它可以被派生类的成员函数引用。
用保护继承方式建立的派生类称为保护派生类,其基类称为保护基类。
基类中的成员 | 在保护派生类中的访问属性 |
---|---|
私有成员 | 不可以访问 |
公用成员 | 保护 |
保护成员 | 保护 |
例:派生类中引用保护成员
#include <iostream>
#include <string>
using namespace std;
class Student //声明基类
{
public: //基类公用成员
void display();
protected: //基类保护成员
int num;
string name;
char sex;
};
void Student::display()//定义基类成员函数
{
cout<<"num:"<<num<<endl;
cout <<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
class Student1:protected Student //以protected方式声明派生类Student1
{
public:
void display_1(); //派生类公用成员函数
private:
int age; //派生类私有数据成员
string addr; //派生类私有数据成员
};
void Student1::display_1() //定义派生类公用成员函数
{
cout<<"num:"<<num<<endl; //引用基类的保护成员,合法
cout <<"name:"<<name<<endl; //引用基类的保护成员,合法
cout<<"sex:"<<sex