Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;如何区分派生类中的基类?_C++_Oop_Inheritance - Fatal编程技术网

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

C++ c++;如何区分派生类中的基类?,c++,oop,inheritance,C++,Oop,Inheritance,我知道这不是最好的标题,但我不知道如何解释这个问题,我没有例子 我有一个基类(称为vector3) 然后我有另一个类,来自vector3,称为vector4: class vector4 : public vector3 { protected: double ct; public: vector4(): vector3(0,0,0), ct=0 {} vector4(double ctin): ct(ctin) {} vector4(double cti

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

我有一个基类(称为vector3)

然后我有另一个类,来自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值,以及粒子beta向量的x值、y值和z值

对于向量4,我只需要做:

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

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

在您的例子中,粒子是一个向量4,因此您可以在向量4中定义getter public,并直接调用
particle.getX()

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

假设粒子有一个向量叫做
\u vector

您可以定义如下所示的方法:

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

在您的例子中,particle是vector4,所以您可以在vector4中定义getter public,并直接调用
particle.getX()

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

假设粒子有一个向量叫做
\u vector

您可以定义如下所示的方法:

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

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

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

仅当子类和超类之间存在is-a关系时,才应使用继承。

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

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

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

我认为在这种情况下使用继承是个坏主意。粒子真的是向量吗?或者它有位置吗?没错。矢量4不是矢量3,粒子也不是矢量。继承模型是“is-a”关系,这显然不是您在这里所拥有的,因此您使用了错误的语言特性来完成您想要做的事情。喜欢合成而不是继承。通常每个粒子都有一个分量向量位置和另一个向量速度,或者沿着这些线。Protip:编译器会自动为您生成空的析构函数,而无需执行任何操作。不要为
~vector3(){}
@captainjamie之类的事情操心,你可以添加一条注释,告诉老师编译器生成的析构函数正是它需要做的。他(希望)只是想知道在编写类时不要忘记析构函数。我认为在这种情况下使用继承是个坏主意。粒子真的是向量吗?或者它有位置吗?没错。矢量4不是矢量3,粒子也不是矢量。继承模型是“is-a”关系,这显然不是您在这里所拥有的,因此您使用了错误的语言特性来完成您想要做的事情。喜欢合成而不是继承。通常每个粒子都有一个分量向量位置和另一个向量速度,或者沿着这些线。Protip:编译器会自动为您生成空的析构函数,而无需执行任何操作。不要为
~vector3(){}
@captainjamie之类的事情操心,你可以添加一条注释,告诉老师编译器生成的析构函数正是它需要做的。他(希望)只是想知道在编写类时不要忘记析构函数。好吧,假设beta也是一个向量4,那么我该如何返回它?好吧,假设beta也是一个向量4,那么我该如何返回它?好吧,好吧,这似乎是一个更合理的方法,是的。在给出一个被接受的答案之前,我会再给大家几分钟时间征求意见。对,好吧,这似乎是一个更明智的方式,是的。我会再给大家几分钟时间征求意见,然后再给出一个被接受的答案。