C++中为了增加代码的复用性,引入了继承的概念
1.继承的定义:用已经创建好的类来创建新的类,新类具有原来类的属性和成员,而且可以对原先的类进行修补。新类称为子类或者派生类,旧类称为基类或者父类。
派生类定义:
class 派生类名 :继承类型 基类名
{
。。。。(成员变量)
};
2.继承权限:
(注意,父类中的所有private,在子类的内部和外部都不能进行访问,以下省略)
public继承:
父类中的public,在子类中也是public,类的内部和外部都能访问。
父类中的protected,在子类中是protected,类的内部可以访问,外部无法访问
protected继承:
父类中的public:在子类中是protected,类的内部可以访问,外部无法访问
父类中的proteced,在子类中是protected,类的内部可以访问,外部无法访问
private继承:
父类的public:在子类中是private,类的内部可用,外部不可用
父类的protected,在子类中是private,类的内部可用,外部不可用
不声明默认继承为private。
一般声明为public
3.构造与析构
遵循一个原则,先构造父类,再构造子类,析构正与其相反
etc: class A
{
protected:
int ma;
public:
A(int a){ma = a; cout<<"A构造"<<endl;}
~A(){cout<<"A析构"<<endl;}
};
class B: public A
{
protected:
int mb;
public:
B(int a,int b) : A(a) //构造时,需要调用父类构造函数,所以需要初始化列表
{mb = b;cout<<"B构造"<<endl;}
~B(){cout<<"B析构"<<endl;}
};
输出为 A构造 B构造 B析构 A析构
4.多继承
一个子类继承多个父类
格式 class 子类名 :继承权限 父类名1,继承权限 父类名2
{
};
拥有多个父类的成员函数
如果父类中有重名函数及成员现象 需要添加限定域作用符::
etc B a1(2.3);
a1.A::print(); && a1.C::print();
如果出现子类(暂称D)继承的两个父类(暂称B,C)同时继承个父类(暂称A),而D类需要调用A类的成员,
如果单调用的话会歧义,因为B和C调用了两个A类的构造,所以编译器不会知道是谁的,所以会出现歧义。要解决这个现象,需要在定义时加virtual
etc :
格式 class 子类名 :virtual 继承权限 父类名1
{
};