我有父类
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时,它给出了我在上面发布的错误。
答案 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; };
}