使用class有时可能会遇到这种情况,基类中的函数func有多个重载版本,在派生类中对其中一个进行了重定义。通过派生类只能访问重定义的版本,如果派生类想通过自身类型使用基类所有的重载版本,则派生类要么重定义所有重载版本,要么一个也不重定义。如果基类中重载版本太多,在派生类中全重定义一遍太麻烦了。
这就是using
关键字适用的场合,可以在派生类中为重载成员名称提供 using 声明,使派生类使用的全是基类的函数版本。在此基础上,再重定义需要的那些函数,其他版本仍是基类的版本。
说的太抽象了,看代码:
class Base
{
public:
Base()
{ }
void func(int i) { std::cout << "func in base " <<i<< endl;}
void func(float i) { std::cout << "func in base " <<i<< endl;}
void func(bool flag) { std::cout << "func in base " <<flag<< endl;}
};
class Derived : public Base
{
public:
Derived()
{
}
// using Base::func;
void func(int i) { std::cout << "func in derived " <<i*5<< endl;}
};
Derived d;
d.func(12);
d.func(false);
d.func(float(12.20));
不加using
时,运行结果是:
func in derived 60
func in derived 0
func in derived 60
加using
后,只有参数是int的重载版本是派生类重定义的,运行结果是:
func in derived 60
func in base 0
func in base 12.2