c++继承与友元
文章目录
一、继承
1.定义:
在类之间既能体现其共性的差别,又能给出其间存在共性和差别关系的信息,还能将这样的关系按照需要进行传递的类型化机制。
2.基本格式
class <派生类名>:<继承方式><基类名>{
<派生类新定义成员>
};
派生类会自动获得基类的非private成员;
继承方式包括 公有继承public 保护继承protected 私有继承private 默认为私有继承
3.继承方式与基类成员被继承后在派生类权限变化
基类原成员权限 | 公有继承public | 保护继承protected | 私有继承private |
---|---|---|---|
private | 派生类不可访问 | 派生类不可访问 | 派生类不可访问 |
protected | protected | protected | private |
public | public | protected | private |
规律:继承后的权限取继承方式与原权限中较高的一种
4.派生类构造函数
<派生类名>(总参数表):<基类名>(<参数表1>)<对象成员名>(<参数表2>){
<派生类数据成员初始化>
};
例:
//定义基类
class Shape{
protected:
double area;
public:
double getarea(){
return area;
}
Shape(double a){
area=a;
}
};
//派生类
class Rectangle:public Shape{
private:
double length,weigth;
public:
Rectangle(double a,double b):Shape(a*b){//派生类构造函数
length=a;
weigth=b;
}
};
注:当基类中没有显式的定义构造函数、或定义了无参数构造函数,派生类构造函数初始化 表可以省略,采用隐含调用。
5.构造函数与析构函数的调用顺序:
构造函数调用顺序:基类的构造函数->基类对象成员的构造函数->派生类的构造函数
析构函数的调用顺序刚好相反
二、友元
1.关于友元
由于无论哪种继承方式基类的私有成员在派生类中都是不可被访问的。,只能通过基类的成员函数访问,如果在一个派生类要访问基类中的私有成员,则可用关键字friend在基类中将这个派生类声明为基类的友元。
如下:派生类B可以直接访问基类A的私有成员
class A{
friend class A;
};
class B:public A{
};
注:友元关系不可继承
2.友元函数
可以将一个函数声明为友元,该函数可直接访问私有成员,如下:
class A{
friend int fun();
private:
int a;
};
int fun(){
return a;
}
三、多继承
1.声明方式:
class <派生类名>:<继承方式><基类名1>,<继承方式><基类名2>...{
<派生类新定义成员>
};
2.构造函数:
与单继承类似,总参数表要包含所有基类初始化所需参数。
3.多继承的问题:
(1)若多个基类有同名成员,在派生类用调用会导致报错。
(2)基类与派生类有同名成员,则基类的成员被隐藏。
(3)二义性:
假设有基类A,A派生两个类B和C,类D继承B和C,会导致D从B,C中继承两份A的成员。
4.二义性的解决办法:虚基类
同上,假设有基类A,A派生两个类B和C,类D继承B和C,可以将基类A设置成虚基类,这样只会继承一份A的成员:
class A{
};
class B:virtual public A{
};
class C:virtual public A{
};
class D:public B,public C{
};
注:调用构造函数时会先调用虚基类的构造函数