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