最近在研究using的使用,除了能够引入某些作用域中的变量和函数外,另一个用途是子类修改父类成员函数的访问权限
先看代码吧:
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
cout<<"Base Constructor!"<<endl;
}
void func(int n = 1)
{
cout<< "Base func ! n = "<<n<<endl;
}
void func(float f)
{
cout<<"Base func ! f = "<<f<<endl;
}
void Derived(int a)
{
cout<<"Base Child !"<<endl;
}
};
class Derived : private Base
{
public:
using Base::func;//成功引入父类所有的func
using Base::Derived;//失败,由于与子类构造函数重名
void func(int n = 1)
{
cout<<"Derived func ! n = "<<n<<endl;
}
Derived()
{
cout<< "Derived Constructor !" <<endl;
}
};
int main(int argc,char **argv)
{
cout<<__FILE__<<':'<<__func__<<" begin!"<<endl;
Derived c;
c.func(1);
c.func(1.1f);
c.Base::Derived(123);//失败
return 0;
}
其中父类的成员函数不与子类类名相同的都可以成功引进来,但是如果和子类类名相同(Derived)那么编译就会报错说已经指定了构造函数,在C++98和C++11均不能通过编译,求大神赐教
最好父类成员函数名不要与子类名相同
这个是C++语法规范要求,你引用了父类的函数,但是它跟子类的构造函数冲突了,所以编译器报错提示了,需要你修改,这种情况你应该是避免在父类中使用子类特殊的函数名。比如这里的构造函数