C++using关键字

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
{
   publicusing 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!
}
隐藏/重载/覆盖
  • 关于三者区别,这里简单的解释一下
  1. 重载:同名函数,函数的参数类型、参数个数不同,同域下的函数的关系。继承中,一般不考虑。
  2. 隐藏:子类重写了父类的代码,将父类中的内容隐藏。
  3. 覆盖:只在重写父类虚函数时发生。覆盖的概念,一般是和多态关联的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值