继承
一、类之间的关系
类 A 称为基类(父类),类B称为派生类(子类)
二、基类和派生类
类继承关系的语法形式
class 派生类名 : 基类名表
{
数据成员和成员函数声明
};
基类名表 构成
访问控制 基类名1, 访问控制 基类名2,… ,访问控制 基类名n
访问控制表示派生类对基类的继承方式,使用关键字:
public 公有继承
private 私有继承
protected 保护继承
2.
派生类的生成过程经历了三个步骤:
●吸收基类成员(全部吸收(构造、析构除外),但不一定可见)
在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。
●改造基类成员
通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。
●添加派生类新成员
仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。
例如:
- 姓名、性别、年龄(访问权限设置为私有)
-
定义公有的成员函数 set_p ()
-
定义公有的成员函数 display_p (), 显示 person 的信息
-
再由基类派生出学生类(不定义构造函数,采用 公有继承 的方式)
-
增加学号、班级、专业和入学成绩
-
定义公有成员函数 set_t ()
-
定义成员函定义公有的成员函数 display_s (), 显示所有的信息
#include<iostream>
#include <string>
using namespace std;
class Person
{
string name;
int age;
string sex;
public:
void set_p() {
cout<<"name\tage\tsex"<<endl;
cin>>name>>age>>sex;
}
void show_p() {
cout<<name<<" "<<age<<" "<<sex<<endl;
}
};
class student :public Person
{
string no;
string zhuanye;
string t_class;
float score;
public:
void set_t(){
set_p(); //调用继承于基类的成员函数访问继承于基类的私有数据成员
cout<<"zhuanye\tt_class\tscore"<<endl;
cin>>zhuanye>>t_class>>score;
}
void show_t() {
show_p();
cout<<zhuanye<<" "<<t_class<<" "<<score<<endl;
}
};
3.重名成员
类名:: 成员
(1)重名数据成员
例:
class base
{ public :
int a , b ;
} ;
class derived : public base
{ public :
int b , c ;
} ;
void f ()
{ derived d ;
d . a = 1 ;
d . base :: b = 2 ;
d . b = 3 ;
d . c = 4 ;
};
4.派生类中访问静态成员
- 基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
- 根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
- 派生类中访问静态成员,用以下形式显式说明:类名:: 成员 或通过对象访问 对象名 . 成员
三、基类的初始化
- 在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据
-
派生类构造函数声明为
派生类构造函数 ( 变元表 ): 基类 ( 变元表 ), 对象成员1(变元表 )
… 对象成员n ( 变元表);
构造函数执行顺序:基类->对象成员->派生类
2.派生类构造函数和析构函数的定义规则
派生类构造函数和析构函数的使用原则
四、多继承
1.一个类有多个直接基类的继承关系称为多继承
2.
class 派生类名: 访问控制 基类名1, 访问控制 基类名2, … , 访问控制 基类名n
{
数据成员和成员函数声明
};
3.
多继承方式下构造函数的执行顺序:
●先执行所有基类的构造函数
●再执行对象成员的构造函数
●最后执行派生类的构造函数
4.赋值兼容规则
●赋值兼容规则指在程序中需要使用基类对象的任何地方,都可以用公有派生类的对象来替代。
5.注意的问题
(1)声明为指向基类的指针可以指向它的公有派生类的对象,但不允许指向它的私有派生类的对象。
(2)允许将一个声明为指向基类的指针指向其公有派生类对象,但是不能将一个声明为指向派生类对象的指针指向其基类的一个对象。
(3) 声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类的定义的成员。
五、心得体会
继承的一个最大的作用就是可以减少代码的重复书写,来达到简化程序的目的。我们在使用继承时可以找出两个类或几个类之间的相同的地方,把相同的部分作为一个基类来单独定义。用的时候可直接调用。子类可以继承父类私有成员,但不能使用,父类成员尽量不定义成私有的。尽量不要用多继承。