C++ c++;如何区分派生类中的基类?
我知道这不是最好的标题,但我不知道如何解释这个问题,我没有例子 我有一个基类(称为vector3) 然后我有另一个类,来自vector3,称为vector4: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
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,那么我该如何返回它?好吧,好吧,这似乎是一个更合理的方法,是的。在给出一个被接受的答案之前,我会再给大家几分钟时间征求意见。对,好吧,这似乎是一个更明智的方式,是的。我会再给大家几分钟时间征求意见,然后再给出一个被接受的答案。