bil*_*llz 4 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) { ... };
};
Run Code Online (Sandbox Code Playgroud)
如果fn函数使用C1状态,是否正在使用破解封装?
这using句话不会破坏封装; 它不会暴露privateC1中的任何状态或阻止C1维持其不变量.它纯粹是一种方便的方式来暴露fnC1所拥有的其他成员 - 在这种情况下int fn(int)- 因此在解析调用时可以考虑它们.可以认为它在功能上等同于......
class C2 : public C1
{
...
inline int fn(int j) { return C1::fn(j); }
};
Run Code Online (Sandbox Code Playgroud)
...但更好,因为您不必手动添加和删除功能以与C1的重载列表保持同步.
如果fn()函数没有使用C1状态,我应该声明一个帮助类是更好的方法吗?
如果他们没有使用C1状态,那么他们应该是静态的或非成员的.在我看来,助手课程是一个丑陋的想法.命名空间是在C++中对功能进行分组的常用方法.我完全了解Lakos教授建议使用课程并理解所有论点,但仍然不同意.如果提到帮助程序类对你来说不仅仅是一件好事,那么很高兴能够完成它.