has-a关系的两种实现方式:私有继承与包含类对象成员

1、包含类对象成员

//.h
#include <string>
#include <valarray>
Class Student {
	std::string name; // 包含类对象成员方式
	std::valarray<double> scores[10]; 
}

通过成员变量直接访问成员方法。

2、私有继承
基类的公有成员和保护成员都将称为派生类的私有成员(包括变量与方法),这意味着,派生类只继承了基类的实现,但没有继承接口。只能通过派生类成员方法访问基类成员

//.h
#include <string>
#include <valarray>
Class Student : private std::string, 
				private std::valarray<double>{
	//不需要成员变量
}

私有继承不能也不需要在派生类中定义基类成员变量

a、访问基类成员变量:强制类型转换

std::cout<<"name: " <<(const string & )student<<std::endl;

类方法内通过对*this进行强转进行访问

//string类中保存类名字变量,通过强转将类对象student变为string变量

b、访问基类方法:
i、作用域解析运算符与类名

只能派生类公有方法中使用,因为是私有继承。
由于私有继承,基类所有成员变量、方法在派生类中均为私有,只能在派生类的公有方法中调用

double Studnet::sum() const {
	return std::valarray<double>::sum();
}

ii、使用using重新定义访问权限 推荐使用

//.h
Class Student: private std::string, 
			   private std::valarray<double>{
public:
	using std::valarray<double>::min;
	//using 声明只使用成员名,不需要圆括号(),特征标、返回类型
}
//.cpp
std::cout<<student.min(); //此时基类成员函数可直接调用,即使是私有继承

3、扩展:保护继承
在这里插入图片描述在这里插入图片描述

4、如何确定使用私有继承还是包含成员
在这里插入图片描述

总结

1、通常使用包含类对象成员来建立has-a关系,在新类中需要访问原有类的保护成员或需重定义虚函数则使用私有继承。
2、私有继承不能也不需要在派生类中定义基类成员变量。
3、私有继承通过类声明中使用using重新定义访问权限,来调用基类成员方法。
4、私有继承通过类型强制转换访问基类成员变量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值