何时使用using声明
when to use using declaration?
我知道下面的using C1::fn;
将把C1中声明的fn(…)函数带到C2中,但我想知道在设计中这种using
的最佳实践是什么?
如果fn()函数没有使用C1状态,我应该声明一个helper类是更好的方法吗?如果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) { ... };
};
如果fn函数使用C1状态,是否使用破坏封装?
此using
语句不会破坏封装;它不暴露来自C1的任何CCD_ 6状态或阻止C1保持其不变量。这纯粹是一种方便的方式,可以公开C1拥有的任何其他fn
成员(在本例中为int fn(int)
),以便在解析调用时可以考虑它们。把它想象成功能上等同于…
class C2 : public C1
{
...
inline int fn(int j) { return C1::fn(j); }
};
但更好的是,您不必手动添加和删除函数来与C1的重载列表保持同步。
如果fn()函数不使用C1状态,我应该声明一个helper类是更好的方法吗?
如果它们不使用C1状态,那么它们应该是静态的或非成员的。在我看来,帮助类是一个丑陋的想法。命名空间是C++中对功能进行分组的常用方法。我完全理解拉科斯教授的建议,即使用课堂并理解所有论点,但我仍然不同意。如果提到helper类对你来说只是一件过眼云烟的事情,那么很乐意浏览一下。
我认为每次需要using
时都应该使用它。也就是说,每当基类的成员函数被派生类中声明的成员函数隐藏时。
我的理由是访问C2
(例如通过C2 *pc
)的代码知道C2
是从C1
派生的,因此期望能够通过pc
调用C1
函数。
相关文章:
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
- 如何正确转发声明结构"using XXX"?
- 我可以在using声明中正确使用C++20概念吗
- using声明不能引用类成员
- 是否可以在 using 声明中引用用户定义的转换模板?
- 如何使用模板声明"std::array" "using"
- 是否可以为成员的方法编写类似于固有方法的 using 声明?
- 指定面向具有相同名称的不同函数的类内 using 声明
- 引用 using 声明引入的功能的句子是什么意思?
- 为什么名称查找在找到使用 using 指令隐式声明的实体时不停止?
- 通过派生类模板参数指定基类模板参数之一。如何使用基类的 using 声明
- 在 C++ 中使用关键字 using 声明模板化函数指针的语法
- 何时使用using声明
- 为什么以及如何"using namespace"声明会混淆C++中的编译器?
- 为什么使用using声明引入的私有基类中的成员模板不可访问
- 'using'声明为SFINAE
- using声明如何减少可用于在没有 ADL 的情况下查找的名称
- 我可以在C++类中声明"using namespace"吗?
- 使用嵌套命名空间声明"using namespace"时出错 ( "namespace xxx::yyy not allowed in using-declaration" )