0

我想了解派生类是否重载了基类func,(基类有int参数,der类有double参数)当我创建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

4 回答 4

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)

如果没有像这样的隐藏,你就失败了

于 2013-07-09T19:26:26.807 回答
0

为什么这会调用 der 类函数???

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

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);

于 2013-07-09T19:29:04.803 回答
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;
    }
};
于 2013-07-09T20:07:37.960 回答
0

我不是 C++ 程序员,但我相当确定该语言可以识别由传递给它的参数调用的函数/方法以及名称。f(int) 与 f(double) 不同。对多态性进行一些搜索

于 2013-07-09T19:26:40.993 回答