4

我知道下面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) { ... };
};
4

2 回答 2

6

如果 fn 函数使用 C1 状态,是否使用破坏封装?

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

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

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

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

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

于 2012-11-13T11:08:36.837 回答
1

我会说你应该在using每次需要时使用它。也就是说,每次基类的成员函数被派生类中声明的成员函数隐藏时。

我的理由是代码访问C2(例如 via C2 *pc)知道它C2是派生自的C1,因此期望能够C1通过pc.

于 2012-11-13T11:00:40.240 回答