您引用的链接是针对 namespace 的,您应该引用 class using-declaration 的声明:
如果派生类已经有一个具有相同名称、参数列表和限定条件的成员,则派生类成员会隐藏或覆盖(不与)从基类引入的成员。
对于您发布的代码,Base 中的void fun() 被Derived 中的void fun() 隐藏,所以不,它们并非都是“可见的”,除非您在调用@987654328 时明确表示@,例如:
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
另外,既然你公开的派生自Base,严格来说,你不需要using声明;如果void fun() 是protected 中的protected 或者你private/protected'ly 继承自Base,你会这样做,例如:
#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;
}
希望能帮到你