using关键字的作用

1. 通常using关键字用来声明当前文件的命名空间,比如声明标准库的命名空间std:

using namespace std;

但是在c++11中,还有其他的用处

2.给变量定义别名

用法例如:

using unit = unsigned int;

使用类型别名unit代替unsigned int

3.在子类中使用using声明引入基类成员名称

  1. 解除因继承导致的成员保护或私有化限制,将基类成员引入到派生类的相应访问控制区域内,便可按照相应规则访问该基成员;
#include <iostream>
using namespace std;

class Base {
public:
    void foo(float a) {cout << "Base::foo" << endl;}
};

class Derived: private Base {
public:
    using Base::foo;
    // void foo(int a) {cout << "Derived::foo" << endl;} // 第9行
};

int main()
{
    Derived d;
    d.foo(3);
    return 0;
}
// 注释掉第9行结果:Base::foo
// 不注释掉第9行结果:Derived::foo

/*
在private或者protected继承时,基类成员的访问级别在派生类中受限:
在这一继承层次中,成员函数foo在Base中为public,但在Derived中为private。为了使它在Derived中成为public,可以在Derived的public
部分增加一个using声明。改变Derived的定义,可以使foo成员能够被用户访问
*/
  1. 派生类欲重载基类成员(正常情况下,基类函数会被重写,如果派生类需要重载需要为每个派生类重写基类函数);
#include <iostream>
using namespace std;

class Base {
public:
    void foo(float a) {cout << "Base::foo_float" << endl;}

    void foo(char a) {cout << "Base::foo_char" << endl;}
};

class Derive : public Base {
public:
    using Base::foo;                    // 第9行,获得基类所有此函数的重载版本,
    void foo(int* a) {cout << "Derive::foo_int*" << endl;}
};

int main()
{
    Derive d;
    int a = 8;
    int * b = &a;
    d.foo(float(8.0)); // 第18行
    return 0;
}
// 如果注释掉第9行,则第18行会报错
// 结果 Base::foo_float

/*
如果基类中成员函数有多个重载版本,派生类可以重定义所继承的0个或多个版本,
但是通过派生类型只能访问派生类中重定义的那些版本,所以如果派生类想通过自身类型使用所有的重载版本,
则派生类必须要么重定义所有重载版本,要么一个也不重定义。

有时类只想重定义一个版本,并且还想继承其他重载版本,此种情况可以在派生类中为重载成员名称提供using声明,
使派生类不用重定义所继承的每一个基类版本,就可以访问基类中所有重载版本。
*/

“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)
2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
posted on 2020-04-14 16:06  JJ_S  阅读(985)  评论(0编辑  收藏  举报