3

我无法让派生类访问基类中定义的函数。名为 Particle.h 的基类头文件是:

class Particle {
    protected:
        vector<double> x_,y_,z_;

        // lots of other protected members that are not relevant to the question

    public:

        // constructors and other functions not relevant to question are omitted
        virtual double getX(const unsigned int index, const double theta, const double phi);
        virtual vector<double> getX(const double theta, double Real phi);
        vector<double> getX(const unsigned int surfindex);
}

这个函数的定义在一个名为 Particle.cc 的文件中:

#include "Particle.h"

vector<double> Particle::getX(const unsigned int surfindex)
{
    vector<double> xp;
    xp.clear();
    xp.resize(3,0.0);
    xp[0] = x_.at(surfindex);
    xp[1] = y_.at(surfindex);
    xp[2] = z_.at(surfindex);

    return xp;
}

名为 Star.h 的派生类头文件是:

#include "Particle.h"

using namespace std;

class Star : public Particle {

    public:

       // constructors and other functions not relevant to question are omitted here

       virtual void computeRoundness(const unsigned int method);
       double getX(const unsigned int index, const double theta, const double phi);
       vector<double> getX(const double theta, double Real phi);
}

computeRoundness 函数的定义在名为 Star.cc 的文件中:

#include "Star.h"

// Lots of other function definitions not relevant to question are omitted here

void Star::computeRoundness(const unsigned int method)
{
    vector<double> X;
    unsigned int count = 0;
    while (count < ntheta) {
       X = getX(count);      // Should call base class function, right?

       // do some more things with X that are not relevant to this question
    }
}

但我收到这个编译时错误:

Star.cc: In member function ‘virtual void Star::computeRoundness(unsigned int)’:
Star.cc:1340: error: no matching function for call to ‘Star::getX(unsigned int&)’
Star.h:687: note: candidates are: virtual double Star::getX(unsigned int, double, double)
Star.h:696: note:                 virtual std::vector<double, std::allocator<double> > Star::getX(double, double)

我过去在其他C++项目中已经成功地从派生类中调用了基类函数,所以我这里一定是忽略了一些简单的东西,但我就是找不到。我认为基类函数应该由派生类继承,除非它们被声明为虚拟然后在派生类中被覆盖(但这里不是这种情况),即使派生类重载了函数名,就像我在这里所做的那样次。这不是真的吗?如果没有,有什么优雅的方法可以解决这个问题,而不仅仅是在派生类中重新定义相同的函数?

非常感谢您的帮助。

4

3 回答 3

6

您必须添加using getX;派生类,或particle::getX在函数中使用。

该标准规定,如果派生具有相同名称的函数,则不会自动使用基类的函数——即使派生的函数不适合。是为了防止bug。

您必须告诉派生类它将使用基类的函数(通过具有using getX;direvtive)或显式调用基类的函数(通过调用particle::getX(...)

于 2013-09-26T20:58:48.490 回答
0

基类中函数getX的声明为:

virtual vector<double> getX(const double theta, double Real phi);

定义是:

vector<double> Particle::getX(const unsigned int surfindex)
{
    //Stuff
}

签名不符!更改声明,代码将起作用

顺便说一句,一个矢量的副本非常昂贵,请考虑使用参考更改您的设计

于 2013-09-26T21:37:31.043 回答
0

答案是这样的:如果基类有“n”个函数的重载版本,并且在派生类中重新定义/覆盖(更改主体)或重载(更改签名)该函数,那么只有该版本在派生类可供您使用。

样本:

class Base
{
    public:
    int abc(){}
    float abc(){}
};

class Der:public Base
{
    public:
    SomeClassObj abc(){} //int and float returning versions of abc are now hidden for Der object
};

覆盖/重新定义也是如此。

于 2013-09-27T01:37:03.403 回答