C ++在继承的类函数重载问题(c++ issue with function overloadin

2019-07-17 23:44发布

这可能是一个小白的问题,很抱歉。 在C ++中,函数重载和继承一些高层次的东西周围试图乱,当我面临着一个奇怪的问题最近。

我将展示一个简单的例子,只是为了说明问题;

有两类, classAclassB如下;

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
};

据我了解classB现在应该posses 2个func(..)功能,过多的占用不同的参数。

但是,当在main方法尝试这一点;

int main(){
    int a;
    char b[20];
    classB objB;
    objB.func(a);    //this one is fine
    objB.func(b);    //here's the problem!
    return 0;
}

它给错误作为方法void func(char[]){}; 这是在父类, classA ,是不是INT派生类,可见classB

我该如何克服这个问题? 这不就是在C ++中如何超载的作品? 我是新来的C ++,但在Java中,我知道我可以利用这样的事情。

虽然我已经发现了这个线索 ,询问有关类似的问题,我觉得这两种情况是不同的。

Answer 1:

所有你需要的是一个using

class classB:public classA{ 
    public:
        using classA::func;
        void func(int){};
};

它不搜索基类func因为它已经找到了一个在派生类中。 在using声明所带来的其他重载到相同的范围,以便它可以参与重载决议。



Answer 2:

这是很好的例子在这个问题的答案解释:

为什么我应该使用“使用”关键字来访问我的基类的方法?

总之,编译器将停止搜索匹配来自父类的方法,当它发现在当前类匹配方法的名称,即使该方法不兼容。 我想这让一些自动的类型转换到更具逻辑性工作,而无需重写这么多的父类的方法。



Answer 3:

如果覆盖在派生类中的函数的一个变体,你需要重写所有变体。 您可以使用哪些JLledo建议或写功能的变种在派生类简单地调用相同签名的基类的功能。

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
        void func(char[]){};
};

void classB:func(char[] ch)
{
    classA::func(ch);
}


Answer 4:

你必须通过int类型的参数中

objB.func(b);    //here's the problem!

BCS已经超负荷int参数



文章来源: c++ issue with function overloading in an inherited class