曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2111|回复: 0
打印 上一主题 下一主题

保护派生或私有派生时如何让基类方法在类外可用?

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2013-12-13 13:30:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Q : 保护派生或私有派生时如何让基类方法在类外可用?

A: 使用保护派生或私有派生时,基类的公有成员将成为保护成员或私有成员。那么如何让基类的方法在派生类外可用呢?有两种方法。

方法一:定义一个使用该基类方法的派生类方法

假设 Student 类是 valarray ()的一个派生类,现在希望 Student 类能够使用 valarray 类中的 sum() 方法,那么可以在 Student 类的声明中声明一个同名的 sum() 方法,然后像下面这样定义该方法:
  1. double Student::sum() const   // public Student 方法
  2. {
  3.    return std::valarray<double>::sum();   //使用私有继承方法
  4. }
复制代码
像上面的做法,就是将私有继承的方法,封装到派生类中 public 里的一个同名方法中。

方法二:使用 using 声明

将函数调用包装在另一个函数调用中,可以像名称空间那样使用一个 using 声明,用来指出派生类可以使用特定的基类成员,即使是私有派生也适用。

假设希望通过 Student 类能够使用 valarray 中的 min() 和 max() 方法,那么可以在声明 Student 的头文件的公有部分加入如下 using 声明:
  1. class Student : private std::string, private std::valarray<double>
  2. {
  3. ... ...
  4. public:
  5.     using std::valarray<double>::min;
  6.     using std::valarray<double>::max;
  7. ... ...
  8. };
复制代码
上述 using 声明使得 valarray<double>::min() 和 valarray<double>::max() 可用,使用它们就像是直接使用 Student 的公有方法一样。

需要注意的是,using 声明只使用成员名(没有圆括号、函数特征标 和 返回类型)。又比如,为使用 Student 类可以使用 valarray 中的 operator[]() 方法,那么如下声明:
  1. using std::valarray<double>::operator[];
复制代码
using 声明只适用于继承,而不适用于包含。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-17 20:51 , Processed in 0.070790 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表