C++ 继承:动态派生类成员与静态派生类成员
目的是实现一个基类:vector_base 对于如何为下面概述的两个向量类创建基类,我有一些误解 第一:基类是否应该为每个派生类提供一个构造函数和一个默认构造函数?或者有没有方法调用基本构造函数来完成此场景中的派生C++ 继承:动态派生类成员与静态派生类成员,c++,inheritance,polymorphism,c++14,C++,Inheritance,Polymorphism,C++14,目的是实现一个基类:vector_base 对于如何为下面概述的两个向量类创建基类,我有一些误解 第一:基类是否应该为每个派生类提供一个构造函数和一个默认构造函数?或者有没有方法调用基本构造函数来完成此场景中的派生 class three: public two { private: double z; public: three(double x = 0, double y = 0, double z = 0) : two(x, y), // call
class three: public two
{
private:
double z;
public:
three(double x = 0, double y = 0, double z = 0)
: two(x, y), // call two(double, double) to initialize x & y
z(z)
// ...
};
第二:基类应该有两组坐标(x,y,z)静态还是动态(指针类型)
第三:访问器和变异器在每种情况下如何工作;有没有理由考虑关键词:虚拟和覆盖?
基本上,如果数据成员是double类型和double类型,我不理解如何实现多态性*
class vector_static
{
private:
double x;
double y;
double z;
public:
vector_static(double x = 0, double y = 0, double z = 0)
: x(x), y(y), z(z) {}
vector_static(const vector_static& copy)
: x(copy.x), y(copy.y), z(copy.z) {}
~vector_static()
{
std::cout << "vector_static::~vector_static() " << std::endl;
};
class vector_dynamic
{
private:
double* x = nullptr;
double* y = nullptr;
double* z = nullptr;
public:
vector_dynamic(double x = 0, double y = 0, double z = 0)
: x {new double (x)},
y {new double (y)},
z {new double (z)}
{
}
vector_dynamic(const vector_dynamic& copy)
: x{new double (copy.get_x() )},
y{new double (copy.get_y() )},
z{new double (copy.get_z() )}
{
}
~vector_dynamic()
{
std::cout << "\nvector_dynamic::~vector_dynamic()" << std::endl;
delete x;
delete y;
delete z;
}
};
类向量\u静态
{
私人:
双x;
双y;
双z;
公众:
向量_静态(双x=0,双y=0,双z=0)
:x(x),y(y),z(z){}
向量静态(常量向量静态和复制)
:x(copy.x),y(copy.y),z(copy.z){}
~vector_static()
{
std::coutvector\u static
和vector\u dynamic
是不相关的,您不能以多态方式使用它们。它们需要有一个公共基类,定义可以调用以访问坐标的虚拟函数。然后您可以覆盖每个派生类中的这些方法来获取或设置坐标;一个是直接访问成员,另一个将取消对指针的引用
class vector_generic {
public:
virtual double getX();
virtual void setX(double);
...
}
class vector_static : public vector_generic {
public:
double getX() {
return x;
}
double setX(double newX) {
x = newX;
}
...
}
class vector_dynamic : public vector_generic {
public:
double getX() {
return *x;
}
double setX(double newX) {
*x = newX;
}
...
}
使用此选项,您可以执行以下操作:
vector_generic *vec1 = new vector_static();
vector_generic *vec2 = new vector_dynamic();
cout << vec1->getX() << vec2->getX() << '\n';
vector_generic*vec1=new vector_static();
向量_generic*vec2=新向量_dynamic();
cout getX()getX()vector\u dynamic
的意义是什么?似乎没有任何理由在那里使用指针。也许他将向量容器与他的向量坐标混合,这个(名称vector
)不会与std::vector
冲突(如果它没有“使用”)?如果您没有使用名称空间std;
将不会有任何冲突。但我已更新了我的答案,以使用更好的名称。