抽象类型作为类成员变量的问题

时间:2011-09-24 03:01:04

标签: c++ class virtual

我尝试在我的类定义中使用抽象类类型作为成员变量,但不知何故它有一些问题。这是抽象类类型:

class POINT{
   public:
       virtual int point_dim() = 0;
       /*other virtual functions...*/ 
}

这是继承的类:

class POINTX : public POINT{
   public:
       int point_dim(){return 10;}
}

我创建了另一个类来使用POINT作为成员变量,因为POINT是一个纯虚拟类,我只能将它声明为指针:

class SPACE{
   public:
       POINT* m_point;
       /*some other declarations*/
}

但是当我在我的主要部分使用它时,它并不像我期望的那样工作:

int main(){
    POINTX *ptx = new POINTX();
    SPACE space;
    space.m_point = (POINT*)ptx;
    //some function call use POINT as parameter(pass by reference):
    func(*space.m_point, ....);
}
调用func(space.m_pint)时发生

错误。但是,如果我这样做没有类SPACE,那没关系。 e.g:

int main(){
    POINTX *ptx = new POINTX();
    POINT *m_point = (POINT*)ptx;
    //some function call use POINT as parameter(pass by reference):
    func(*m_point, ....);
}

任何人都知道什么是错的?

1 个答案:

答案 0 :(得分:2)

POINT声明:

   virtual int point_dim() const = 0;

因此,POINTX必须有一个名为const的{​​{1}}方法:

point_dim

如果没有这个,它将有两个 int point_dim() const {return 10;} 方法,一个非point_dim()和一个const,但纯const,将virtual保留为抽象。< / p>

只要POINTX引用带到func()

POINT

你可以这样称呼它:

int func(const POINT& pt)
{
    const int dim = pt.point_dim();
    // ...
}

另外,请注意您不需要C风格的演员阵容:

func(*space.m_point);

当你完成时不要忘记space.m_point = ptx;