c++ bagaimana cara membedakan kelas dasar di kelas turunan?

Saya mengerti ini bukan judul terbaik tetapi saya tidak yakin bagaimana menjelaskan masalah yang saya alami ini tanpa contoh.

Saya memiliki kelas dasar (disebut 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

};

Lalu saya punya kelas lain, yang berasal dari vector3, yang disebut 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

};

Dan itu semua baik-baik saja, tapi sekarang saya punya kelas bernama particle yang didefinisikan seperti ini:

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

Jadi sekarang pertanyaannya adalah:
Bagaimana cara mengembalikan nilai x, nilai y, dan nilai z dari posisi partikel, serta nilai x, nilai y, dan nilai z dari vektor beta partikel di dalam fungsi di kelas partikel?

Dengan vektor 4 saya baru saja melakukan:

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

dll, tapi apa yang akan saya gunakan di kelas partikel?


person Jamie Twells    schedule 21.03.2014    source sumber
comment
Saya yakin menggunakan warisan dalam kasus ini adalah ide yang buruk. Apakah partikel benar-benar vektor? Atau apakah ia memiliki posisi a?   -  person Shoe    schedule 21.03.2014
comment
Tepat sekali. Sebuah vektor4 bukanlah sebuah vektor3, dan sebuah partikel bukanlah sebuah vektor. Model warisan adalah sebuah hubungan, dan itu jelas bukan yang Anda miliki di sini, jadi Anda menggunakan fitur bahasa yang salah untuk apa yang ingin Anda lakukan. Lebih menyukai komposisi daripada warisan.   -  person Asik    schedule 21.03.2014
comment
Biasanya Anda memiliki posisi vektor komponen dan kecepatan vektor lain untuk setiap partikel, atau sesuatu yang serupa dengan itu.   -  person dutt    schedule 21.03.2014
comment
Protip: kompiler secara otomatis menghasilkan destruktor kosong untuk Anda tanpa Anda perlu melakukan apa pun. Jangan repot-repot dengan hal-hal seperti ~vector3() {}.   -  person R. Martinho Fernandes    schedule 21.03.2014
comment
@R.MartinhoFernandes Tapi saya kehilangan nilai jika tidak... :)   -  person Jamie Twells    schedule 21.03.2014
comment
@captainjamie Anda dapat menambahkan komentar yang memberi tahu guru bahwa destruktor yang dihasilkan kompiler melakukan apa yang perlu dilakukan. Dia (mudah-mudahan) hanya ingin tahu bahwa Anda tidak melupakan destruktor saat menulis kelas.   -  person Arne Mertz    schedule 21.03.2014


Jawaban (2)


Posisi dan vektor beta adalah atribut dari sebuah partikel, jadi Anda harus menggunakan agregasi daripada pewarisan:

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

Anda sebaiknya hanya menggunakan pewarisan jika terdapat hubungan is-a antara subkelas dan superkelas.

person ecatmur    schedule 21.03.2014
comment
Benar, oke, sepertinya itu cara yang lebih masuk akal, ya. Saya akan memberi orang beberapa menit lagi untuk memberikan saran sebelum menandai jawaban yang diterima. - person Jamie Twells; 21.03.2014

Dalam kasus Anda, partikel adalah vektor4, sehingga Anda dapat mendefinisikan getter publik di vektor4, dan langsung memanggil particle.getX()

Namun sepertinya ini bukan ide yang bagus, menurut saya partikel harus mengandung vektor karena bukan merupakan spesialisasi dari kelas vector4.

jadi misalkan partikel mempunyai vektor bernama _vector

Anda dapat mendefinisikan metode seperti ini:

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

Hal yang sama berlaku untuk getY

person Intrepidd    schedule 21.03.2014
comment
Oke, misalkan beta juga merupakan vector4, lalu bagaimana cara mengembalikannya? - person Jamie Twells; 21.03.2014