using – deklarace
Deklarace using
zavádí název do deklarativní oblasti, ve které se zobrazí deklarace using.
Syntaxe
using [typename] nested-name-specifier unqualified-id ;
using declarator-list ;
Parametry
specifikátor vnořených názvů A posloupnost názvů, tříd nebo názvů výčtů a operátorů překladu oborů (::), ukončená operátorem překladu oboru. K zavedení názvu z globálního oboru názvů lze použít jeden operátor překladu oboru názvů. Klíčové slovo typename
je volitelné a lze ho použít k překladu závislých názvů při zavedení do šablony třídy ze základní třídy.
unqualified-id An unqualified id-expression, which may be an identifier, an přetížení operator name, a user-defined literal operator or conversion function name, a class destructor name, or a template name and argument list.
deklarator-list A čárkami oddělený seznamtypename
[] vnořený specifikátor-název-specifikátorunqualified-id , následovaný volitelně třemi tečkami.
Poznámky
Deklarace using zavádí nekvalifikovaný název jako synonymum pro entitu deklarovanou jinde. Umožňuje použít jeden název z konkrétního oboru názvů bez explicitní kvalifikace v oblasti deklarace, ve které se zobrazí. To je na rozdíl od direktivy using, která umožňuje použití všech názvů v oboru názvů bez kvalifikace. Klíčové using
slovo se také používá pro aliasy typů.
Příklad: using
Deklarace v poli třídy
Deklarace using lze použít v definici třídy.
// using_declaration1.cpp
#include <stdio.h>
class B {
public:
void f(char) {
printf_s("In B::f()\n");
}
void g(char) {
printf_s("In B::g()\n");
}
};
class D : B {
public:
using B::f; // B::f(char) is now visible as D::f(char)
using B::g; // B::g(char) is now visible as D::g(char)
void f(int) {
printf_s("In D::f()\n");
f('c'); // Invokes B::f(char) instead of recursing
}
void g(int) {
printf_s("In D::g()\n");
g('c'); // Invokes B::g(char) instead of recursing
}
};
int main() {
D myD;
myD.f(1);
myD.g('a');
}
In D::f()
In B::f()
In B::g()
Příklad: using
Deklarace deklarací člena
Pokud se používá k deklaraci členu, musí deklarace using odkazovat na člen základní třídy.
// using_declaration2.cpp
#include <stdio.h>
class B {
public:
void f(char) {
printf_s("In B::f()\n");
}
void g(char) {
printf_s("In B::g()\n");
}
};
class C {
public:
int g();
};
class D2 : public B {
public:
using B::f; // ok: B is a base of D2
// using C::g; // error: C isn't a base of D2
};
int main() {
D2 MyD2;
MyD2.f('a');
}
In B::f()
Příklad: using
deklarace s explicitní kvalifikací
Na členy deklarované pomocí deklarace using lze odkazovat pomocí explicitní kvalifikace. Předpona ::
odkazuje na globální obor názvů.
// using_declaration3.cpp
#include <stdio.h>
void f() {
printf_s("In f\n");
}
namespace A {
void g() {
printf_s("In A::g\n");
}
}
namespace X {
using ::f; // global f is also visible as X::f
using A::g; // A's g is now visible as X::g
}
void h() {
printf_s("In h\n");
X::f(); // calls ::f
X::g(); // calls A::g
}
int main() {
h();
}
In h
In f
In A::g
Příklad: using
synonyma a aliasy deklarace
Při použití deklarace se synonymum vytvořené deklarací odkazuje pouze na definice platné v okamžiku deklarace using. Definice přidané do oboru názvů po deklaraci using nejsou platná synonyma.
Název definovaný using
deklarací je alias pro původní název. Nemá vliv na typ, propojení nebo jiné atributy původní deklarace.
// post_declaration_namespace_additions.cpp
// compile with: /c
namespace A {
void f(int) {}
}
using A::f; // f is a synonym for A::f(int) only
namespace A {
void f(char) {}
}
void f() {
f('a'); // refers to A::f(int), even though A::f(char) exists
}
void b() {
using A::f; // refers to A::f(int) AND A::f(char)
f('a'); // calls A::f(char);
}
Příklad: Místní deklarace a using
deklarace
S ohledem na funkce v oborech názvů, pokud je v deklarativní oblasti uvedena sada místních deklarací a použití deklarací pro jeden název, musí všechny odkazovat na stejnou entitu, nebo musí všechny odkazovat na funkce.
// functions_in_namespaces1.cpp
// C2874 expected
namespace B {
int i;
void f(int);
void f(double);
}
void g() {
int i;
using B::i; // error: i declared twice
void f(char);
using B::f; // ok: each f is a function
}
Ve výše uvedeném příkladu using B::i
příkaz způsobí deklaraci sekundy int i
g()
ve funkci. Příkaz using B::f
není v konfliktu s f(char)
funkcí, protože názvy funkcí zavedené B::f
různými typy parametrů.
Příklad: Deklarace a using
deklarace místní funkce
Deklarace místní funkce nemůže mít stejný název a typ jako funkce zavedená pomocí deklarace. Příklad:
// functions_in_namespaces2.cpp
// C2668 expected
namespace B {
void f(int);
void f(double);
}
namespace C {
void f(int);
void f(double);
void f(char);
}
void h() {
using B::f; // introduces B::f(int) and B::f(double)
using C::f; // C::f(int), C::f(double), and C::f(char)
f('h'); // calls C::f(char)
f(1); // C2668 ambiguous: B::f(int) or C::f(int)?
void f(int); // C2883 conflicts with B::f(int) and C::f(int)
}
Příklad: using
deklarace a dědičnost
Pokud jde o dědičnost, při použití deklarace zavádí název ze základní třídy do odvozeného oboru třídy, členské funkce v odvozené třídě přepisují virtuální členské funkce se stejným názvem a typy argumentů v základní třídě.
// using_declaration_inheritance1.cpp
#include <stdio.h>
struct B {
virtual void f(int) {
printf_s("In B::f(int)\n");
}
virtual void f(char) {
printf_s("In B::f(char)\n");
}
void g(int) {
printf_s("In B::g\n");
}
void h(int);
};
struct D : B {
using B::f;
void f(int) { // ok: D::f(int) overrides B::f(int)
printf_s("In D::f(int)\n");
}
using B::g;
void g(char) { // ok: there is no B::g(char)
printf_s("In D::g(char)\n");
}
using B::h;
void h(int) {} // Note: D::h(int) hides non-virtual B::h(int)
};
void f(D* pd) {
pd->f(1); // calls D::f(int)
pd->f('a'); // calls B::f(char)
pd->g(1); // calls B::g(int)
pd->g('a'); // calls D::g(char)
}
int main() {
D * myd = new D();
f(myd);
}
In D::f(int)
In B::f(char)
In B::g
In D::g(char)
Příklad: using
Přístupnost deklarace
Všechny instance názvu uvedené v deklaraci using musí být přístupné. Konkrétně pokud odvozená třída používá pro přístup k členu základní třídy deklaraci using, musí být název člena přístupný. Pokud je název přetížené členské funkce, musí být všechny pojmenované funkce přístupné.
Další informace o přístupnosti členů najdete v tématu Řízení přístupu členů.
// using_declaration_inheritance2.cpp
// C2876 expected
class A {
private:
void f(char);
public:
void f(int);
protected:
void g();
};
class B : public A {
using A::f; // C2876: A::f(char) is inaccessible
public:
using A::g; // B::g is a public synonym for A::g
};
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro