当基类成员函数发生重载时在派生类中需要加入using 声明语句,否则将会发生同名函数隐藏的结果;
#include <iostream>
using namespace std;
class A
{
public:
void fun()
{
cout << "I'm A." << endl;
}
void fun(int i)
{
cout << "I'm A too." << endl;
}
};
class B :public A
{
public:
void fun()
{
cout << "I'm B" << endl;
}
};
int main()
{
B *b = new B();
b->fun();
b->fun(2); //提示错误函数B::fun不接受1个参数
return 0;
}
代码b->fun(2)将报错
添加using 声明语句后,错误消失
class B :public A
{
public:
using A::fun; //添加using 语句
void fun()
{
cout << "I'm B" << endl;
}
};
添加using后输出结果
当基类中虚函数发生重载时,效果相同
#include <iostream>
using namespace std;
class A
{
public:
virtual void fun()
{
cout << "I'm A." << endl;
}
virtual void fun(int i)
{
cout << "I'm A too." << endl;
}
};
class B :public A
{
public:
void fun() override
{
cout << "I'm B" << endl;
}
};
int main()
{
B *b = new B();
b->fun();
b->fun(2); //提示错误函数B::fun不接受1个参数
//强制转换b的类型为A;
(*(A *)b).fun(2); //正确,将输出I'm A too
return 0;
}
加入using 声明语句
class B :public A
{
public:
using A::fun;
void fun() override
{
cout << "I'm B" << endl;
}
};
错误消失
总结:无论基类中含有虚函数还是非虚函数当发生重载时,派生类中因加入 using 声明语句,访问权限为using前标识符决定;using+类名+::+成员名;加上using后再定义特定的函数以防止从派生类调用基类中重载函数失败的错误发生;