多态性中的多类型输出

Multiple Type output in Polymorphism

本文关键字:输出 多类型 多态性      更新时间:2023-10-16

当我想创建一个纯虚拟函数并为其分配多种输出格式(如int、double和char)时,我遇到了一个问题。

我写了下面的代码,只有当我删除了我的抽象类时,它才有效,这不是我想要的。

我的代码:

enter code here

    //class DynamicArray
          //{
          //    public:
          //        virtual void GetData(unsigned int s, int& d) = 0;
          //        virtual void SetData(unsigned int s, int& d) = 0;
          //};
      
      
      
      class DynamicArrayDouble//: public DynamicArray
      {
          private:
              unsigned int m_Length;
              double* arr;
          public:
              DynamicArrayDouble(unsigned int l)
              {
                  m_Length = l;
                  arr = new double[m_Length];
              }
              void SetParam(unsigned int l)
              {
                  m_Length = l;
                  arr = new double[m_Length];
              }
              void GetData(unsigned int s, double& d)
              {
                  d = arr[s];
              }
              void SetData(unsigned int s, double& d)
              {
                  arr[s] = d;
              }
      };

当我取消注释DynamicArray类并且DynamicArrayDouble继承它时,我会遇到一些错误。需要注意的是,我第一次尝试使用void*作为Set和Get方法的第二个参数,但我再次收到一些错误,我不能像这样使用这种代码样式:错误:无法将变量"d1"声明为抽象类型"DynamicArrayDouble"

上述错误代码为:

    class DynamicArray
    {
        public:
            virtual void GetData(unsigned int s, void* d) = 0;
            virtual void SetData(unsigned int s, void* d) = 0;
    };
    
    class DynamicArrayDouble: public DynamicArray
    {
        private:
            unsigned int m_Length;
            double* arr;
        public:
            DynamicArrayDouble(unsigned int l)
            {
                m_Length = l;
                arr = new double[m_Length];
            }
            void SetParam(unsigned int l)
            {
                m_Length = l;
                arr = new double[m_Length];
            }
        void GetData(unsigned int s, double* d)
        {
            *d = arr[s];
        }
        void SetData(unsigned int s, double* d)
        {
            arr[s] = *d;
        }
    };
    
    int main()
    {
        DynamicArrayDouble d1(5);
        double x=0;
    
        for(unsigned int i=0;i<5;i++)
        {
            x = ((i+1.0)/2);
            d1.SetData(i,&x);
        }
    
        for(unsigned int i=0;i<5;i++)
        {
            d1.GetData(i,&x);
            cout << "Data " << i+1 << " is = " << x << endl;
        }
    
        return 0;
    }

我用代码块写代码。

我会感谢你的回答。。。非常感谢。

您不能简单地覆盖

void func(some_pointer_type ptr);

带有

void func(some_other_pointer_type ptr);

参考文献也是如此。事实上,如果它们不匹配,就被认为是完全无关的。

DynamicArrayDouble——这个名字告诉我,你应该研究模板,而不是为你需要的所有类型编写相同的代码。STL就是这样工作的。您将完全避免运行时多态性。

对于初学者:

template <typename T>
DynamicArray;