C\C++_继承_继承权限

1. 继承的特征

特征公有继承保护继承私有继承
公有成员变成派生类的公有成员派生类的保护成员派生类的私有成员
保护成员变成派生类的保护成员派生类的保护成员派生类的私有成员
私有成员变成只能通过基类接口访问只能通过基类接口访问只能通过基类接口访问
能否隐式向上转换是(但只能在派生类中)

2. 继承权限的用途

继承权限类型作用备注
公有继承
保护继承也可以使用has-a关系和私有继承主要区别是:私有继承无法将基类的公有成员和保护成员提供给下一个类继承,但保护的可以
私有继承私有继承可以使用has-a关系,但同时也会引发很多问题,而且较为抽象不易理解,通常应使用包含来建立has-a关系;如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应使用私有继承参考书籍:c++ primer plus(第六版)——14.2.2 使用包含还是私有继承

3. 继承权限的代码示例

  1. 私有继承
#include <iostream>
#include <valarray>

//! 私有继承来实现has-a关系
//! 实现的注意点有两个:
	//! 一、访问基类对象(因为继承的本质是在派生类中嵌入一个基类对象,而这个对象没有显示命名);
	//! 二、访问基类的友元函数
	//! 三、访问基类的公有函数和保护函数,可以使用类名和作用域解析运算符来调用基类的方法
class CStudent: private std::string, private std::valarray<double>
{
public:
	CStudent(const std::string &s, int n)	//< 有参构造函数
		:std::string(s),ArrayDb(n){}

	const std::string& Name() const
	{										//!	一、访问基类对象
		return (const std::string&)*this;	//! 1.强制类型转换:为使用基类对象本身,则可以使用强制类型转换来创建一个引用
	}										//!	2.该引用指向用于调用该方法CStudent对象中的继承而来的std::string对象

	friend std::ostream& operator<<(std::ostream& os, const CStudent& stu)
	{
		//os << "Scores for " << (const std::string&)stu << "\n";	//< 二、访问基类的友元函数(这里只是举例友元函数的访问方式,std::string没有重载<<运算符)
	}
	double Average() const		//< 三、访问基类的公有方法和保护方法
	{
		if (ArrayDb::size() > 0)
			return ArrayDb::sum()/ArrayDb::size();
		else
			return 0;
	}
private:
	typedef std::valarray<double> ArrayDb;
};

int main()
{
	CStudent stu("hello world", 5);
	std::cin.get();
	return 0;
}

4. 使用using重新定义访问权限

使用保护派生或私有派生时,基类的公有成员将成为保护成员或私有成员。假设要让基类的方法在派生类外面可用:

  1. 方法一:
    定义一个使用该基类方法的派生类方法。例如:
public:
double Student::sum() const
{
	return std::valarray<double>::sum(); //< use privately-inherited method
}
  1. 方法二:
    使用一个using 声明(就想名称空间那样)来指出派生类可以使用特定的基类成员,即使采用的是私有派生。例如:
class Student: private std::string, private std::valarray<double>
{
public:
	using std::valarray<double>::min;  //< 如果ArrayDb在作用域中,也可以使用ArrayDb
	using std::valarray<double>::max;	
	//! 注:using声明只使用成员名——没有园括号、函数特征标和返回类型。例如using std::valarray<double>::operator[];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值