2 lliangboyan lliangboyan 于 2015.07.05 21:09 提问

C++ using 父类成员函数与子类类名相同怎么办

最近在研究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均不能通过编译,求大神赐教

2个回答

u013671245
u013671245   2015.07.05 23:19

最好父类成员函数名不要与子类名相同

lliangboyan
lliangboyan 这个肯定,但是万一有这个需求,有没有解决方法呢
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.07.06 19:09

这个是C++语法规范要求,你引用了父类的函数,但是它跟子类的构造函数冲突了,所以编译器报错提示了,需要你修改,这种情况你应该是避免在父类中使用子类特殊的函数名。比如这里的构造函数

Csdn user default icon
上传中...
上传图片
插入图片