Le lien que vous faites référence est pour namespace
« s, vous devriez plutôt se référer à la class
using-declaration où il est dit:
Si la classe dérivée a déjà membre du même nom, la liste des paramètres et qualifications, le membre de classe dérivé cache ou remplace (n'est pas en conflit avec) le membre qui est introduit à partir de la classe de base.
Dans le cas de votre code affiché, void fun()
dans Base
est caché par void fun()
dans Derived
, donc pas, ils ne sont pas à la fois « visible », sauf si vous êtes explicite lorsque vous appelez fun
, par exemple:
class Base {
public:
void fun() { std::cout << "base" << std::endl; }
};
class Derived : public Base {
public:
using Base::fun;
void fun() { std::cout << "derived" << std::endl; }
};
Derived d;
d.fun(); // name lookup calls Derived::fun
d.Base::fun(); // explicitly call Base::fun
En outre, puisque vous avez dérivé publiquement de Base
, à proprement parler, vous n'avez pas besoin de la déclaration using
; vous le feriez dans l'instance void fun()
étaient protected
dans Base
ou vous private
/protected
« ment hérité de Base
, par exemple:
#include <iostream>
class Base {
public:
void fun() { std::cout << "base" << std::endl; }
protected:
void fun2() { std::cout << "base2" << std::endl; }
};
// class default is private
class Private : Base {
public:
// fun() won't be accessible since private inheritance and no using
// fun2 can now be accessed directly
using Base::fun2;
};
class Public : public Base {
public:
// fun is already public
using Base::fun2; // bring into scope
};
class Derived : public Base {
public:
using Base::fun;
using Base::fun2;
// overriden method fun, no conflict, choose this method if type is Derived
void fun() { std::cout << "derived" << std::endl; }
};
int main(int argc, char* argv[])
{
Private p;
Public u;
Derived d;
// generates a compiler error since Base is privately inherited
//p.fun();
p.fun2(); // OK, output: base2
u.fun(); // OK, output: base
u.fun2(); // OK, output: base2
// use Derived::fun since override
d.fun(); // OK, output: derived
d.Base::fun(); // OK, output: base
d.fun2(); // OK, output: base2
return 0;
}
espoir qui peut aider
un lien plus direct serait http: // fr. cppreference.com/w/cpp/language/using_declaration – Cubbi