继承:在已有类的基础上创造新类。其中已有类称为基类或父类,创造出的新类称为派生类或子类。
继承的格式为 class 派生类名:基类名。
继承的类型我们一般都是使用公有继承。
在继承时需要将基类的数据成员声明为保护类型,因为派生类无法直接使用基类的私有成员。
派生类中包括了基类中的所有成员(除构造函数和析构函数)。
在派生类中定义与基类中同名的成员可以屏蔽基类中的成员。
通过显示的使用类名限定符: 类名::成员 可以使用被屏蔽了的基类成员。
派生类访问静态成员:
基类中定义的静态成员可以被所有派生类访问。在派生类中访问静态成员的方式一种是显示说明(类名::成员),另一种是通过对象进行访问(对象.成员)
基类的初始化:
派生类构造函数的声明为: 派生类构造函数(变元表):基类(变元表),对象成员(变元表)
一般格式是
派生类::派生类名(参数总表):基类名(参数表)
{
// 派生类新增成员的初始化语句
}
class A
{
protected:
int a,b;
public:
A(int z,int x):a(z),b(x){};
};
class B:A
{
int c,d;
public:
B(int q,int w,int e,int r):A(q,w){c=e;d=r;}
};
构造函数的执行顺序:基类、对象成员、派生类。析构函数的执行顺序与构造函数相反。
派生类构造函数和析构函数的定义规则:
1、基类的构造函数和析构函数不能被继承
2、如果基类没有定义构造函数或有无参的构造函数, 派生类也可以不用定义构造函数
3、如果基类无无参的构造函数,派生类必须定义构造函数
4、如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造
5、派生类是否定义析构函数与所属的基类无关
多继承就是一个类继承多个基类,因为多继承常常会涉及到二义性问题并不好用所以不推荐使用。
class A//基类
{
public:
int a1,a2;
A(int i1=0,int i2=0){a1=i1;a2=i2;}
void print()
{
cout<<"a1="<<a1<<" "<<"a2="<<a2<< endl ;
}
};
class B:public A//使用公有继承 派生类
{
public:
int b1,b2;
B(int j1=1,int j2=1){b1=j1;b2=j2;}
void print()//定义同名函数
{
cout<<"b1="<<b1<<" "<<"b2="<<b2<<endl ;
}
};
int main()
{
B b;
b.A::print();//使用类名限定符来调用基类中被屏蔽了的基类成员
b.print();
}
//输出结果 a1=0 a2=0
// b1=1 b2=1
感悟:继承的使用一般是在写完程序后找到程序中相同的操作然后将其选出来构成一个类其他类来继承它。继承的使用可以大大简化代码缩短代码的长度,今后一定会经常用到。