С++ как различать базовые классы в производном классе?

Я понимаю, что это не лучшее название, но я не уверен, как объяснить эту проблему, с которой я столкнулся, без примеров.

У меня есть базовый класс (называемый 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 бета-вектора частицы внутри функции в классе частиц?

С вектором 4 я бы просто сделал:

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

и т. д., но что бы я использовал в классе частиц?


person Jamie Twells    schedule 21.03.2014    source источник
comment
Я считаю, что в этом случае использовать наследование - плохая идея. Действительно ли частица является вектором? Или у него есть позиция a?   -  person Shoe    schedule 21.03.2014
comment
Ну точно. Вектор4 не является вектором3, а частица не является вектором. Модели наследования - это отношения, и это явно не то, что у вас здесь, поэтому вы используете неправильную языковую функцию для того, что хотите сделать. Предпочтите композицию наследованию.   -  person Asik    schedule 21.03.2014
comment
Обычно у вас есть позиция вектора компонента и другая скорость вектора для каждой частицы или что-то в этом роде.   -  person dutt    schedule 21.03.2014
comment
Совет: компилятор автоматически генерирует для вас пустые деструкторы, и вам не нужно ничего делать. Не беспокойтесь о таких вещах, как ~vector3() {}.   -  person R. Martinho Fernandes    schedule 21.03.2014
comment
@R.MartinhoFernandes Но я теряю оценки, если не делаю... :)   -  person Jamie Twells    schedule 21.03.2014
comment
@captainjamie, вы можете добавить комментарий, сообщающий учителю, что сгенерированный компилятором деструктор делает именно то, что ему нужно. Он (надеюсь) просто хочет знать, что вы не забываете деструкторы при написании класса.   -  person Arne Mertz    schedule 21.03.2014


Ответы (2)


Позиция и бета-вектор являются атрибутами частицы, поэтому вы должны использовать агрегацию вместо наследования:

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

Вы должны использовать наследование только там, где существует отношение is-a между подклассом и суперклассом.

person ecatmur    schedule 21.03.2014
comment
Хорошо, хорошо, это кажется более разумным способом, да. Я дам людям еще несколько минут для предложений, прежде чем отметить принятый ответ. - person Jamie Twells; 21.03.2014

В вашем случае частица является вектором4, поэтому вы можете определить общедоступные геттеры в векторе4 и напрямую вызвать particle.getX()

Однако это не кажется хорошей идеей, на мой взгляд, частица должна содержать вектор, так как это не специализация класса vector4.

допустим, у частицы есть вектор с именем _vector

вы можете определить такой метод:

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

То же самое касается getY

person Intrepidd    schedule 21.03.2014
comment
Хорошо, предположим, что бета тоже была вектором 4, как бы я ее вернул? - person Jamie Twells; 21.03.2014