Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
IloveOOP
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 19
#1

ох уж этот полиморфизм - C++

01.02.2014, 22:40. Просмотров 684. Ответов 11
Метки нет (Все метки)

Добрый день. имеются классы:
class element {...}
class tableProcedure : public element {...}
Проблема в следующем:
имеется итератор -std::list<element*>::iterator I
объект нужно привести к производному классу :
tableProcedure* tp= dynamic_cast<tableProcedure*>(*I); //вот тут возникает ошибка: "error операнд времени выполнения dynamic_cast должен иметь тип полиморфного класса"
если же использовать static_cast то ошибки нету,решение собирается(правда я не проверял работу),но я читал,что предпочтительнее использовать dynamic_cast,т.к. он проверяет корректность приведения...
объясните пожалуйста в чем проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2014, 22:40     ох уж этот полиморфизм
Посмотрите здесь:

Полиморфизм. - C++
Доброго времени суток. Помогите решить следующую задачку: Создать класс периодическое издание (название, стоимость экземпляра и...

Полиморфизм в с++ - C++
Вообщем я делал программу,изначально в ней было реализовано наследование.Затем дали задание реализовать полиморфзим для функции Scale для...

Полиморфизм :( - C++
Всем здравствуйте. Ребят помогите пожалуйста с полиморфизмом. Я читал некоторые статьи и чем больше их читаю, тем больше возникает...

полиморфизм - C++
Всем привет, изучаю С++ недавно, я новичек в этом языке программирования, читаю про ООП, понял все за исключением полиморфизма, что делает...

Полиморфизм c++ - C++
Построить массив из указателей (базового типа) на объекты обоих классов. Выбрать объекты производного класса, отсортировать их и сложить...

Полиморфизм - C++
Я хотел реализовать множество, используя множественное наследование, но когда написал template &lt;class T&gt; class set { protected: ...

Полиморфизм - C++
В одной дешевой книжке про него пишут а в другой дорогой нет и понять я почему то немогу точно как и для чего он нужен

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Меорн
74 / 59 / 29
Регистрация: 01.02.2014
Сообщений: 202
01.02.2014, 22:50     ох уж этот полиморфизм #2
что-то я не то написал.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
01.02.2014, 22:50     ох уж этот полиморфизм #3
Google подсказывает:
http://stackoverflow.com/questions/4...nd-downcasting
http://stackoverflow.com/questions/8...ot-polymorphic
http://stackoverflow.com/questions/1...hic-base-class

In order for dynamic_cast to work the object needs to be polymorphic. The reason for this is that dynamic_cast needs somewhere to store the type information that is will use to perform the cast, and it does this by storing the information alongside the vtable for the class. In order for there to be a vtable you need to make at least one of your methods virtual.
The easiest way around this is to flag the base class destructor as virtual.
Upcasting (ie derived to base) doesn't needs a cast as the compiler is able to check that the cast would work at compile time. However, the same isn't true when downcasting.
IloveOOP
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 19
01.02.2014, 22:52  [ТС]     ох уж этот полиморфизм #4
так и происходит. element-базовый класс,он и храниться в списке; я хочу получить производный.
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
01.02.2014, 22:55     ох уж этот полиморфизм #5
IloveOOP, и виртуальных методов конечно нет? Нужен хотя бы виртуальный деструктор.
IloveOOP
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 19
01.02.2014, 23:00  [ТС]     ох уж этот полиморфизм #6
не подскажите ещё почему в случае подобного приведения я теряю доступ к защищённым и закрытым членам? т.е. tableProcedure* tp= dynamic_cast<tableProcedure*>(*I) не будет иметь доступ ко всем своим членам
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
01.02.2014, 23:07     ох уж этот полиморфизм #7
IloveOOP, не понял, к "своим" - каким своим? Пример можно?
IloveOOP
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 19
01.02.2014, 23:11  [ТС]     ох уж этот полиморфизм #8
допутим у класса tableProcedure есть закрытые или защищённые члены,к примеру proyected: int i; и после tableProcedure* tp= dynamic_cast<tableProcedure*>(*I),т.е. приведению вверх по иерархии наследования я не смогу обратиться к переменной "i" через "tp"
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
01.02.2014, 23:16     ох уж этот полиморфизм #9
IloveOOP, так это и без dynamic_cast нельзя, защищённые члены доступны только членам класса, его наследникам и друзьям, закрытые - только членам и друзьям класса.
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
01.02.2014, 23:39     ох уж этот полиморфизм #10
У вас в скобках (*I) точно стоит указатель ??? Или вы конкретный объект пытаетесь привести к типу указателя?

Добавлено через 19 минут
Не знаю о чем вы, но у меня на gcc 4.8 это работает без ошибок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <list>
 
class SuperClass {
public:
    virtual void say() {
        std::cout << "i'm SuperClass!" << std::endl;
    }
};
 
class Subclass : public SuperClass {
public:
    virtual void say() {
        std::cout << "i'm Subclass!" << std::endl;
    }
    void sayHello() {
        std::cout << "Hello from subclass non virtual method!" << std::endl;
    }
};
 
int main()
{
    std::list<SuperClass *> list;
    list.push_back(new Subclass);
 
    for (std::list<SuperClass *>::iterator i = list.begin(); i != list.end(); ++i) {
        Subclass * subclassPtr = dynamic_cast<Subclass *>(*i);
        (*i)->say();
        subclassPtr->sayHello();
    }
 
    return 0;
}
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
01.02.2014, 23:44     ох уж этот полиморфизм #11
Buckstabue, о таком.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2014, 23:52     ох уж этот полиморфизм
Еще ссылки по теме:

Полиморфизм - C++
не могу разобраться с полиморфизмом((( Вот как мне вычислить трапеции. У нее ведь три параметра, а не два как у прямоугольника???? ...

полиморфизм=( - C++
Ув.Знатаки Доброго времени суток!Вот есть проблемка с написание полиморфизма,вот написал класс,написал наследование,а вот как теперь сюда...

Полиморфизм - C++
Всем доброго времени суток.Сразу к делу. Если описывать с помощью полиморфизма подклассы и потом динамично их создавать ,то можно вызывать...

С++ и полиморфизм - C++
Здравствуйте. Ответьте пожалуйста на несколько вопросов: 1. Что такое абстрактная функция простыми словами? 2. Что такое...

Полиморфизм - C++
полиморфизм runtime vs compile polymorphism: как вы на проектах определяете, когда стоит пользоваться шаблоном, а когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
01.02.2014, 23:52     ох уж этот полиморфизм #12
Короче, как я понял, для использования dynamic_cast требуется определить хотя бы один виртуальный метод
Yandex
Объявления
01.02.2014, 23:52     ох уж этот полиморфизм
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru