C++using关键字
看google某项目源码时,里面使用了很多using关键字。之前对using关键字的概念,一直停留在引入命名空间中。其实,using关键字还些其他的用途。
引入命名空间
- using关键字最常用的,可能就是导入命名空间。
using namespace std;
using std::cout;
继承中的作用
- 改变访问权限
class Base
{
public:
void func() { cout << "Hello World" << endl;}
}
// private继承会导致 func的可见性为private
// 可使用using,改变访问权限
class Sub : private Base
{
public:
using Base::func;
}
- 继承时子类重写父类方法
- 子类中如果想重写父类函数,比如名为func的函数。并且,假设父类中关于func函数有不同的版本。如果,子类中重写一个函数,就会隐藏父类中所有同名函数。此时,只能通过显示方式调用父类的方法。
- 即使,子类重新父类中的虚函数(覆盖),也会导致该问题。
class Base
{
public:
void func() { // some code}
int func(int n) { // some code}
}
class Sub : public Base
{
public:
// 此处函数定义,会隐藏父类中 int func(int)方法。
void func() { // some code}
}
int main()
{
Sub s;
s.func();
s.func(1); // Error!
}
- 因此,如果不想隐藏父类的同名方法,可以重写所有同名函数。这未免有些麻烦。使用using关键字,即可解决该问题。
class Base
{
public:
void func() { // some code}
int func(int n) { // some code}
}
class Sub : public Base
{
public:
using Base::func;
void func() { // some code}
}
int main()
{
Sub s;
s.func();
s.func(1); // Success!
}
隐藏/重载/覆盖
- 关于三者区别,这里简单的解释一下
- 重载:同名函数,函数的参数类型、参数个数不同,同域下的函数的关系。继承中,一般不考虑。
- 隐藏:子类重写了父类的代码,将父类中的内容隐藏。
- 覆盖:只在重写父类虚函数时发生。覆盖的概念,一般是和多态关联的。