一、基础知识
1.类之间的关系
继承:在已有类的基础上创建新类的过程
(1).类继承关系的语法形式
class 派生类名: 基类名表
{
数据成员和成员函数声明
};
基类名表构成:访问控制 基类名1,访问控制 基类名2,.... ,访问控制 基类名n
访问控制表示派生类对积累的继承方式,使用关键字
public private protected 分别表示公有、私有、保护继承
注意:无论何种方式继承基类,派生类都不能直接使用基类的私有成员
(2).派生类的生成过程经历了三个步骤:
a 吸收基类成员(全部吸收(构造、析构除外),但不一定可见)
b 改造基类成员
c 添加派生类新成员
a 吸收基类成员:在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。
b 改造基类成员:通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基员
c 添加新成员:仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。
3.重名成员
派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽(hide)了基类的同名成员。
在派生类中使用基类的同名成员,显式地使用类名限定符:类名 :: 成员
4.派生类中访问静态成员
(1)基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
(2)根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质 。
(3) 派生类中访问静态成员,用以下形式显式说明:类名 :: 成员或通过对象访问 对象名.成员
5.基类的初始化
在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据。
派生类构造函数声明为:派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 )… 对象成员n ( 变元表 ) ;
构造函数执行顺序:基类 对象成员 派生类6.派生类构造函数和析构函数的定义规则
派生类构造函数和析构函数的使用原则
(1)基类的构造函数和析构函数不能被继承;
(2)如果基类没有定义构造函数或有无参的构造函数,派生类也可以不用定义构造函数;
(3)如果基类无无参的构造函数,派生类必须定义构造函数;
(4)如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造;
(5)派生类是否定义析构函数与所属的基类无关
7.派生类构造函数的定义
在C++中,派生类构造函数的一般格式为:
派生类::派生类名(参数总表):基类名(参数表){
// 派生类新增成员的初始化语句
}
注意:这是基类有构造函数且含有参数时使用8.派生类析构函数
(1)当派生类中不含对象成员时
a 在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
b 在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数→基类的析构函数。
(2)当派生类中含有对象成员时
a 在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
b 在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。
例题
#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;
}
};
心得体会
继承的使用并不具有计划性,它是在程序设计的过程中为减少代码长度而使用的一种方法,比如在定义
类的时候,如果发现两个或多个类有多个共同的数据成员时,就可以使用继承来减少重复的代码出现的次数
使代码更加简洁和易读,是一种很方便的方法