c ++如何区分派生类中的基类?

时间:2014-03-21 12:11:45

标签: c++ oop inheritance

我知道这不是最好的标题,但我不知道如何解释这个我没有例子的问题。

我有一个基类(称为vector3)

class vector3 {

    protected:
        double x,y,z;
public:
    vector3(): x(0),y(0),z(0) {}
    vector3(double xin, double yin, double zin): x(xin),y(yin),z(zin) {}
    ~vector3() {}

 //...other stuff

};

然后我有另一个派生自vector3的类,名为vector4:

class vector4 : public vector3 {

protected:
    double ct;
public:

    vector4(): vector3(0,0,0), ct=0 {}

    vector4(double ctin): ct(ctin) {}

    vector4(double ctin, double xin, double yin, double zin):
        vector3(xin, yin, zin), ct(ctin) {}

    vector4(double ctin, vector3 v):
        vector3(v.getx(), v.gety(), v.getz()), ct(ctin) {}

    ~vector4() {}

//...more other stuff

};

这一切都很好,但现在我有一个名为particle的类定义如下:

class particle : public vector4 {
    protected:
        //vector4 r;
        double mass;
        //vector3 beta;
    public:
        particle(): vector4(0,0,0,0), mass=0, vector3(0,0,0) {}

        particle(vector4 rin, double massin, vector3 betain):
            vector4(rin.getx(),rin.gety(),rin.getz(),rin.getct()),
            mass=0,
            vector3(betain.getx(),betain.gety(),betain.getz()) {}

        ~particle() {}
        //...Further stuff
    };

现在的问题是:
如何在粒子类的函数内返回粒子位置的x值,y值和z值,以及粒子β矢量的x值,y值和z值?

使用vector 4我只会这样做:

double getx() const {
    return x;
}
double gety() const {
    return y;
}

等,但我会在粒子的类中使用什么?

2 个答案:

答案 0 :(得分:4)

位置和β矢量是粒子的属性,因此您应该使用聚合而不是继承:

class particle {
    protected:
        vector4 r;
        double mass;
        vector3 beta;
    // ...

只有在子类和超类之间存在 is-a 关系的情况下才应该使用继承。

答案 1 :(得分:0)

在你的情况下,粒子是vector4,所以你可以在vector4中公开你的getters,然后直接调用particle.getX()

然而,这似乎不是一个好主意,在我看来,粒子应该包含一个向量,因为它不是vector4类的特化。

所以让我们说粒子有一个叫_vector

的向量

你可以定义一个这样的方法:

double getX(void) const
{
  return (_vector.getX());
}

getY

也是如此