向量中另一类的重音方法

Accesing method of another class from vector

本文关键字:一类 方法 向量      更新时间:2023-10-16

我有父类

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();

有人能告诉我怎么修吗?主要目的只是将不同的伪数据类型存储在向量中。但当我想用这些数据类型循环vector并从中调用函数GetSize时,它给了我上面发布的错误。

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