using 新用法
六月 06, 2022using 新用法
引入命名空间
可能在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