C++ 如何使用派生类实例调用基类重载func,

C++ 如何使用派生类实例调用基类重载func,,c++,inheritance,C++,Inheritance,我试图理解派生类是否重载了基类func,(基类有int参数,而der类有双参数),当我创建der类实例并使用正确的参数调用func name时,只调用der func??有人能帮我吗。。在代码(dd.f(d1);)的第28行,我可以得到基类func调用 这是代码 using namespace std; class base { public : virtual void f (int i); }; class der : public base{ p

我试图理解派生类是否重载了基类func,(基类有int参数,而der类有双参数),当我创建der类实例并使用正确的参数调用func name时,只调用der func??有人能帮我吗。。在代码(dd.f(d1);)的第28行,我可以得到基类func调用

这是代码

using namespace std;

class base {

    public :

        virtual void f (int i);

};

class der : public base{

    public:

        void f ( double d);

};

void base::f(int i){

    cout << "Base::f \n";

}

void der::f(double d){

    cout <<"Der::f \n";

}

int main(){

    der dd;

    int i =99;

    double d1 = 3232.232;

    dd.f(i); // why this calls der class func???

    dd.f(d1);

    base *ptr = new der();

    ptr->f(i);

    dynamic_cast<der *>(ptr)->f(d1);

    return 0;
}
使用名称空间std;
阶级基础{
公众:
虚空f(inti);
};
类别:公共基地{
公众:
无效f(双d);
};
空基::f(int i){

cout当您在派生类中用与基类中相同的名称声明函数时,基类中的函数被隐藏

解决方案 您可以创建派生类

class Derived {
    virtual void store(long l) {
        //store another way.
    }
}

and call it like 

Derived d;
d.store(1);
然后有人认为“我可以更快地存储INT!”并创建

Base::store(int)

如果不存在这样的隐藏,则失败。

< p>我不是C++程序员,但我确信语言识别了传递给它的参数所调用的函数/方法,以及名称(f)不同于f(double)。对多态性< /p> < p >搜索为什么调用dE类Func?? 因为编译器仅通过在同一类中声明的函数之间的签名来选择函数。例如,如果您有这样的函数:

class der : public base{

public:
    void f ( double d);
    void f (int i ){cout << "f(int)" <<endl;}
};
class-der:public-base{
公众:
无效f(双d);

void f(int i){cout以下称为覆盖

class baseClass
{
public:
    virtual void DoIt()
    {//.........
    }
}
class child : public baseClass
{
    void DoIt()
    {
        baseClass::DoIt();
    }
}
微软Visual C++中的P> 您可以使用\u super代替基类名称\u super::DoIt()

如果在您的类的公共体中使用base::confusingMethod;时出现问题,您所做的不是重写它,而是使用另一个具有不同签名的方法,如下所示

class base
{
public:
    base(){}
    virtual void Job(int x)
    {
        cout<<"Base"<<endl;
    }
};
class son : public base
{
public:
    using base::Job;
    son(){}
    virtual void Job(float x)
    {
        cout<<"Son"<<endl;
    }
};
类基
{
公众:
base(){}
虚拟无效作业(int x)
{

cout编译器不会在多个作用域中搜索重载。它会在类层次结构中找到“f(…)”的第一个版本并在那里停止。然后它会搜索该类,并且只搜索该类的重载。它会将der::f(double)作为重载,隐式转换为int到double,并使用它。您可以将“using base::f;”放在“der”中要获得所需的行为。根据您的解释,应该调用基类的方法。问题是为什么不调用它。“编译器不需要转到基类”-比这更糟糕。编译器不会转到基类,即使它需要。尝试将“f(int)”更改为“f(std::string)”然后将它称为“DE.F(STD:String())”而不是“DER。(i)”。它不会编译,因为它不能将STD::string转换成双。这个程序只编译,因为C++将自动转换int到双。@ JojG79是的,只有在没有任何(同名)的情况下,编译器才会尝试在基类中找到适当的函数。在派生类中。感谢您的帮助,我之前知道作用域解析运算符。但没有想到:)是的,即使我尝试使用字符串参数调用func f,但即使func在基类中正确声明,它也失败了。但正如RiaD建议添加的“using base::f”在der类中,甚至这个问题也得到了解决。我不知道如果您在der类中重载func,那么基类func将被隐藏。这是一个很好的学习方法。感谢大家分享信息并参与讨论。干杯
class baseClass
{
public:
    virtual void DoIt()
    {//.........
    }
}
class child : public baseClass
{
    void DoIt()
    {
        baseClass::DoIt();
    }
}
class base
{
public:
    base(){}
    virtual void Job(int x)
    {
        cout<<"Base"<<endl;
    }
};
class son : public base
{
public:
    using base::Job;
    son(){}
    virtual void Job(float x)
    {
        cout<<"Son"<<endl;
    }
};