C++ 继承:动态派生类成员与静态派生类成员

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

目的是实现一个基类:vector_base

对于如何为下面概述的两个向量类创建基类,我有一些误解

第一:基类是否应该为每个派生类提供一个构造函数和一个默认构造函数?或者有没有方法调用基本构造函数来完成此场景中的派生

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::cout
vector\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;
将不会有任何冲突。但我已更新了我的答案,以使用更好的名称。