using 新用法

六月 06, 2022

using 新用法

引入命名空间

可能在C++的初学者眼中,using关键字就是对常见的是这两句代码: using namespace std;和using std::cout;

当然,这也是using的最基本的使用方法。

using关键字在类继承的中的作用

##(1)派生类部分覆盖基类的成员函数

在下面的代码中,基类中两个成员函数形成函数重载,在派生类中只对基类的一个成员函数进行了函数覆盖(另一个并没有覆盖),此时在派生类中Func(int)这个函数就被隐藏了,此时如果通过派生类对象调用该方法就会出现编译错误(如下图所示)。

using std::cout;
class Base {
public:
    void foo() { cout << "Base::foo\n"; }
    void foo(int i) { cout << "Base::foo int\n"; }
};

class Derive: public Base {
public:
    void foo() { cout << "Derive\n"}
    using Base::foo;   // 不添加这个, 调用d.foo(1) 会报错!!!
};

int main() {
  Derive d;
  d.foo(1);
  return 0;
}

(2)在类的私有继承中

在类的继承中,存在一个private继承关系,如下代码所示,私有继承时,基类的成员方法不能在派生类中使用。

using std::cout;
class Base {
public:
    void foo(int i) { cout << "Base::foo int\n"; }
};

class Derive: privte Base {
public:
    using Base::foo;   // 不添加这个, 调用d.foo(1) 会报错!!!
};

int main() {
  Derive d;
  d.foo(1);
  return 0;
}

使用using关键字来定义别名

定义普通类型的别名(与typedef类似)

首先,利用using关键字来定义别名的代码有更好的可读性,看下面的例子:

定义一个函数指针,指向的函数返回值是void,输入参数是int型

使用using指定模板的别名(typedef做不到)

如下的代码,可以看出使用using可以声明一个模板类的别名,但是typedef不行。

template<typename T>
// typedef vector<T> Vec; // wrong
using Vec = vector<T>;

链接

https://www.jianshu.com/p/9c99fd307b76 https://blog.csdn.net/w_weixiaotao/article/details/108541021