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

时间:2013-07-09 19:22:35

标签: c++ inheritance

我试图理解派生类是否重载了基类func,(基类有int参数,而der类有双参数)当我创建了类实例并使用正确的参数调用func名称时,只调用了der func ??有人可以帮助我..在代码的第28行(dd.f(d1);)有没有办法,我可以得到基类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;
}

4 个答案:

答案 0 :(得分:2)

当在基类中使用与基类同名的派生类声明函数时,隐藏基类中的函数。

解决方案

`use base::f`

#include <iostream>
using namespace std;

class base {     
public :
    virtual void f (int i); 
};

class der : public base{
public:
    using base::f;
    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;     
    dd.f(i); // Base::f

    return 0;
}

推理

class Base {
    virtual void store(long l){
        //both int and long could be processed
    }
}

您创建派生类

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

and call it like 

Derived d;
d.store(1);

然后有人认为“我可以更快地存储整数!”并创建

Base::store(int)

如果没有像这样的隐藏

你会失败

答案 1 :(得分:0)

我不是C ++程序员,但我确信该语言标识了传递给它的参数调用的函数/方法,以及名称。 f(int)与f(double)不同。做一些关于多态的搜索

答案 2 :(得分:0)

为什么这会调用der class func ???

因为编译器仅通过签名来选择在同一个类中声明的函数之间的函数。例如,如果您有这样的事情:

class der : public base{

public:
    void f ( double d);
    void f (int i ){cout << "f(int)" <<endl;}
};

致电dd.f(i);会将您带到输出f(int)

由于你的der类有一个函数f(),虽然调用参数不匹配,编译器不需要转到base类,它只是转换你的intdouble

要从f()课程明确调用base,您可以这样做:dd.base::f(i);

答案 3 :(得分:0)

以下称为覆盖

class baseClass
{
public:
    virtual void DoIt()
    {//.........
    }
}
class child : public baseClass
{
    void DoIt()
    {
        baseClass::DoIt();
    }
}

在microsoft visual C ++中 您可以使用 _ super 而不是基类名称 _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;
    }
};