曲径通幽论坛

标题: 保护派生或私有派生时如何让基类方法在类外可用? [打印本页]

作者: easy    时间: 2013-12-13 13:30
标题: 保护派生或私有派生时如何让基类方法在类外可用?
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 声明只适用于继承,而不适用于包含。





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2