繁体   English   中英

基类方法访问派生类成员

[英]Base Class method accessing Derived Class members

我有以下情况:

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
};

我如何实施这样的计划

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

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;
  }
};

为什么不使用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还是继承

您有两个选择。

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

另一个选择是使用“ 好奇地重复发生”模板模式 ,如下所示:

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.

有两种解决方案。 首先是使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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM