LINUX.ORG.RU

Почему у меня не работает динамический полиморфизм в C++ ?

 , динамический полиморфизм,


0

2

Имею класс KnowTreeModel, унаследованный от QAbstractItemModel.

Согласно концепции динамического полиморфизма, указатель базового класса может указывать на объект производного. Однако у меня это никогда не получалось:

currentModel=knowTreeView->model();

Error: invalid conversion from 'QAbstractItemModel*' to 'KnowTreeModel*' [-fpermissive]

где:

- currentModel - имеет тип KnowTreeModel*
- knowTreeView->model() - возвращает тип QAbstractItemModel*

И я постоянно пользуюсь static_cast(), чтобы эти типы преобразовывать. Но мне говорят, что этого делать не нужно. А компилятор считает по-другому. Почему так?

★★★★★

Последнее исправление: Wizard_ (всего исправлений: 1)

Ответ на: комментарий от Xintrea

именно.

книжный пример: есть базовый класс Vehicle и его подклассы Car, Truck, Bike. есть виртуальный метод Vehicle::go() который переопределен во всех подклассах. есть std::list<Vehicle*> list, в который напихали, в перемешку, указатели на Car, Truck, Bike:

  list.insert(new Car());
  list.insert(new Truck());
  list.insert(new Bike());

теперь можно пройтись по всем элементам списка, вызывая на них go(). при этом повызыватся методы подклассов:

  for (auto v: list) v->go();

это, в кратце, все, что нужно знать о полиморфизме на крестах. далее имеет смысл почитать про pure virtual methods и vtable.

x0r ★★★★★
()
Последнее исправление: x0r (всего исправлений: 1)
Ответ на: комментарий от andreyu

Andersbakken created branch jsoncompletions at Andersbakken/rtags

16 hours ago

Чувствую себя мерзким кукловодом, делающим дело чужими руками :)

pon4ik ★★★★★
()
Ответ на: комментарий от x0r

это, в кратце, все, что нужно знать о динамическом полиморфизме на крестах.

fixed

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Кстати - чувак который кодил мою задумку, загорелся продолжить сиё. Можешь смело подхватить инициативу, если интересно, я вас сконтачу.

Спасибо, интерес у меня есть, но времени нет. Буду ждать, когда люди умнее меня сделают все сами :)

andreyu ★★★★★
()
Ответ на: комментарий от pon4ik

Чувствую себя мерзким кукловодом, делающим дело чужими руками :)

Чудно :)

andreyu ★★★★★
()
22 ноября 2016 г.

I happened to see this post :)

In the C++ type system, converting from base class to derived class is risky. It can not be implemented automatically. Here with a dynamic_cast <KnowTreeModel *>(knowTreeView-> model()) is a reasonable consideration. If the conversion fails, a null pointer is returned. That is to say, if you enter a knowTreeModel * in some call setModel(QAbstractItemModel * model), and then return the base class pointer from model(), the type information is lost at the time of input. It's based on the Qt framework's restriction. This is one of the reasons I do not like Qt.

I often want to change to a more free GUI. Using Qt to make the prototype does save a lot of consideration of details, but also put you in the shackles at the same time. Open source, free of charge projects, do not have enough funding may have to do such a choice. But if you want to make a more powerful product, Qt is a little bit constrained, is it not?

beimprovised
()
Ответ на: комментарий от beimprovised

По-русски пиши, буржуйский аналог ксинтреа. Ишь чего выдумал — в кьюте у него рестрикшн в его паверфул продукте. Go be fat somewhere else.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.