0

我有以下情况:

class num {
    public:
    void print(ostream* o); // Prints the n variable
};

class int_num : public num{
    public:
    int n; // Initialized by this class's constructor
};

class float_num : public num{
    public:
    float n; // Initialized by this class's constructor
};

class double_num : public num{
    public:
    double n; // Initialized by this class's constructor
};

我如何实施这样的计划

4

4 回答 4

4

给它一个虚拟方法,在派生类型中实现:

class num {
 public:
    void print(ostream& o) const
    {  // Prints the n variable
      doPrint(o);
    }
 private:
    virtual void doPrint(ostream& os) const = 0;
};

class double_num : public num{
  public:
    double n; // Initialized by this class's constructor
 private:
  void doPrint(ostream& os) const 
  {
    os << n;
  }
};
于 2013-01-22T16:24:53.077 回答
2

为什么不使用template

template<typename T>
class num
{
    T n;  //data of type T

 public:

      //add constructor(s) to initialize n

      void print(std::ostream &out) { out << n ; }

      //add functions(s) to work with n
};

这样就可以打印了。

现在你有两个选择:

  • 如果typedef代码中的所有派生类型都在做同样的事情,没有特定类型,则使用:

    //use typedefs
    typedef num<int>    int_num; 
    typedef num<float>  float_num; 
    typedef num<double> double_num;
    
  • 如果您需要在派生类中执行特定类型的操作,或者使用继承:

    class int_num : public num<int>
    {
       //int specific things 
    };
    

关键是num<T>无论您使用typedef还是继承都可以进行打印。

于 2013-01-22T16:25:38.877 回答
1

你有两个选择。

print()正如其他人已经指出的那样,一种是制作纯虚拟并在派生类中实现它。

另一种选择是使用Curiously recurring template pattern,如下所示:

template <typename Impl>
class num
{
public:
  void print(ostream &os) const
  {
    os << static_cast<const Impl*>(this)->n;
  }
};

class int_num : public num<int_num>
{
  //same as before
};

class float_num : public num<float_num>
{
  //same as before
};

//etc.
于 2013-01-22T16:28:19.307 回答
0

有两种解决方案。首先是让print方法成为纯抽象方法,并在所有子类中实现。二是使用模板:

template<typename T>
class num
{
public:
    void print(std::ostream& os) const
        {
            os << num_;
        }

private:
    T num_;
};

typedef num<float> float_num;
typedef num<int>     int_num;
于 2013-01-22T16:25:07.923 回答