何时使用声明?

时间:2012-11-13 10:53:45

标签: c++ encapsulation using

我知道下面using C1::fn;会将C1中声明的fn(...)函数带到C2,但我想知道设计中using的最佳实践是什么?

如果fn()函数没有使用C1状态,我应该声明一个帮助类是更好的方法吗? 如果fn函数正在使用C1状态,那么using会破坏封装吗?

如果你甚至可以在C ++ 11中提到一些用例,我感激不尽。比如使用using Base::Base;构造函数而不是从派生成员初始化程序调用它?

class C1
{
  //...
  public:
    int fn(int j) { ... }
    double fn(double w) { ... }
    void fn(const char * s) { ... }
};

class C2 : public C1
{
  //...
public:
  //...
  using C1::fn;
  double fn(double) { ... };
};

2 个答案:

答案 0 :(得分:6)

  

如果fn函数正在使用C1状态,是否使用了破解封装?

这个using语句并没有打破封装;它不会从C1暴露任何private状态或阻止C1维持其不变量。它纯粹是一种方便的方式来公开C1所拥有的其他fn成员 - 在这种情况下是int fn(int) - 所以在解析调用时可以考虑它们。可以认为它在功能上等同于......

class C2 : public C1
{
    ...
    inline int fn(int j) { return C1::fn(j); }
};

...但更好,因为您不必手动添加和删除功能以与C1的重载列表保持同步。

  

如果fn()函数没有使用C1状态,我应该声明一个帮助类是更好的方法吗?

如果他们不使用C1状态,那么他们应该是静态的或非成员的。在我看来,助手课程是一个丑陋的想法。命名空间是在C ++中对功能进行分组的常用方法。我完全了解Lakos教授关于使用课程和理解所有论点的建议,但仍然不同意。如果提到辅助课程对你来说不仅仅是一件好事,那么很高兴能够完成它。

答案 1 :(得分:1)

我说你应该在每次需要的时候使用using。也就是说,每次基类的成员函数被派生类中的一个被忽略时都会被隐藏。

我的比率是访问C2的代码(例如通过C2 *pc)知道C2来自C1,因此希望能够调用C1函数通过pc