c++继承与友元

c++继承与友元

一、继承

1.定义:

​ 在类之间既能体现其共性的差别,又能给出其间存在共性和差别关系的信息,还能将这样的关系按照需要进行传递的类型化机制。

2.基本格式

class <派生类名>:<继承方式><基类名>{
	<派生类新定义成员>
};

​ 派生类会自动获得基类的非private成员;

​ 继承方式包括 公有继承public 保护继承protected 私有继承private 默认为私有继承

3.继承方式与基类成员被继承后在派生类权限变化

基类原成员权限公有继承public保护继承protected私有继承private
private派生类不可访问派生类不可访问派生类不可访问
protectedprotectedprotectedprivate
publicpublicprotectedprivate

规律:继承后的权限取继承方式与原权限中较高的一种

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{
};

​ 注:调用构造函数时会先调用虚基类的构造函数

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李星且小白blog.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值