using关键字

引入命名空间,一个 using 声明一次只引入一个命名空间,这个不用讲了

使用class有时可能会遇到这种情况:基类中的函数func有多个重载版本,但是派生类只对版本1进行了重定义。 结果派生类 隐藏 了基类中所有版本,通过派生类只能访问重定义的版本1,不能再访问基本的版本2,3,4,则派生类要么重定义所有重载版本,或者一个也不重定义。 如果基类中重载版本太多,在派生类中全重定义一遍就太麻烦了。

这就是using关键字适用的场合,可以在派生类中为重载成员名称提供 using 声明,使派生类使用的全是基类的函数版本。在此基础上,再重定义需要的那些函数,其他版本仍是基类的版本。

说的太抽象了,看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Base
{
public:
Base() {}
virtual ~Base() {}

virtual void func(int i) { std::cout << "func in base " <<i<< endl;}
virtual void func(float i) { std::cout << "func in base " <<i<< endl;}
};

class Derived : public Base
{
public:
Derived() {}
// using Base::func;
virtual void func(int i) { std::cout << "func in derived " <<i*5<< endl;}
};

Derived d;
d.func(12);
d.func(float(12.20));

不加using时,运行结果是:

1
2
func in derived 60
func in derived 60

也就是对于d.func(float(12.20));,派生类仍然调用了自己的版本,但是我们实际上没有定义float参数的虚函数,这并不是我们想要的。

using后,只有参数是int的重载版本是派生类的,派生类没有定义虚函数的情况,还是调用基类的。运行结果是:

1
2
func in derived 60
func in base 12.2

隐藏对虚函数和非虚函数都是适用的,因为Effective C++说不要在派生类重新定义基类的非虚函数,所以这里我定义成了虚函数,由于多个虚函数对sizeof的计算相当于一个,所以不会扩大占用内存,可以仍按照Effective C++说的声明为虚函数。

using 用做 alias

1
2
3
using Type = std::vector<int>;

Type v={1,2,3,4,5,6};