C++核心準(zhǔn)則C.138:使用using為派生類生成重載函數(shù)集合?

C.138: Create an overload set for a derived class and its bases with?using
C.138:使用using為派生類生成重載函數(shù)集合?


Reason(原因)

Without a using declaration, member functions in the derived class hide the entire inherited overload sets.
如果不使用using聲明,派生類中的成員函數(shù)會隱藏整個繼承來的
重載函數(shù)集合。

Example, bad(反面示例)

#include?
class?B?{
public:
????virtual?int?f(int?i)?{
????????std::cout?<"f(int):?";?return?i;?
????}
????virtual?double?f(double?d)?{
????????std::cout?<"f(double):?";?return?d;?
????}
????virtual?~B()?=?default;
};
class?D:?public?B?{
public:
????int?f(int?i)?override?
????{
????????std::cout?<"f(int):?";?return?i?+?1;?
????}
};
int?main()
{
????D?d;
????std::cout?<????std::cout?<}

Example, good(范例)

class?D:?public?B?{
public:
????int?f(int?i)?override?
????{
????????std::cout?<"f(int):?";?return?i?+?1;?
????}
????using?B::f;?//?exposes?f(double)
};

Note(注意)

This issue affects both virtual and nonvirtual member functions
For variadic bases, C++17 introduced a variadic form of the using-declaration,
本條款對虛函數(shù)和非虛函數(shù)都有效。對于可變基類,C++17引入using聲明的可變形式。
template?
struct?Overloader?:?Ts...?{
????using?Ts::operator()...;?//?exposes?operator()?from?every?base
};

Enforcement(實施建議)

Diagnose name hiding
檢出名稱隱藏。

原文鏈接:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c138-create-an-overload-set-for-a-derived-class-and-its-bases-with-using
覺得本文有幫助?請分享給更多人。
關(guān)注【面向?qū)ο笏伎肌枯p松學(xué)習(xí)每一天!
面向?qū)ο箝_發(fā),面向?qū)ο笏伎迹?/p>
