从向量中访问另一个类的方法

时间:2016-05-02 16:19:09

标签: c++ inheritance polymorphism

我有父类

class Data
{
};

从类Data继承的类:

class Struct : public Data
{
  public:
  Struct & AddNewType ( const string & name, Data * x )
  {
     v . push_back ( x );
     return *this;
  }

  void Print ( void ) const
  {
    for ( unsigned int i = 0; i < v . size (); i++ )
      cout << v[i]->GetSize();
  }

  private:
    vector<Data*> v;
};

class Integer : public Data
{
  public:
    int GetSize ( void ) const
    {
      return 4;
    }
};

主要功能:

int main ( void )
{
  Struct  a;
  a . AddNewType ( "Integer", new Integer );
  a . Print ();
  return 0;
}

当我致电a.Print()时,它给了我这个错误:

practice.cpp: In member function ‘void Struct::Print() const’:
practice.cpp:40:21: error: ‘class Data’ has no member named ‘GetSize’
       cout << v[i]->GetSize();

有人能告诉我如何解决这个问题吗?主要目的是在向量中存储不同的伪数据类型。但是当我想用这些数据类型循环向量并从中调用函数GetSize时,它给出了我在上面发布的错误。

1 个答案:

答案 0 :(得分:1)

您的vector v存储Data*类型的对象。 但是,您的Data类不实现GetSize()方法,因此编译器(正确)错误,因为此方法不存在。

您的子类实现它并不重要,因为编译器不知道您是在传递子类还是基类。

您应该将GetSize()方法添加到Data类中,即

class Data {
    public:
        virtual int GetSize() const = 0;
}

这也会强制子类实现GetSize()方法。如果要提供默认行为,可以提供默认实现,即

class Data {
    public:
        virtual int GetSize() const { return 0; };
}