проблема с абстрактным типом в качестве переменной члена класса - PullRequest
0 голосов
/ 24 сентября 2011

Я пытаюсь использовать абстрактный тип класса в качестве переменной-члена в моем определении класса, но каким-то образом у него есть некоторая проблема. Вот абстрактный тип класса:

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 Ответ

2 голосов
/ 24 сентября 2011

POINT объявляет:

   virtual int point_dim() const = 0;

Поэтому POINTX должен иметь const метод с именем point_dim:

   int point_dim() const {return 10;}

Без этого у него будет два point_dim() методов, один не const и один const, но чистый virtual, оставляя POINTX абстрактным.

Пока func() принимает ссылку наa POINT:

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

Вы сможете назвать это так:

func(*space.m_point);

Также обратите внимание, что вам здесь не нужен каст в стиле C:

space.m_point = ptx;

И не забудьте delete ptx, когда вы закончите!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...