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

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

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

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

01.02.2014, 22:40. Просмотров 703. Ответов 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,т.к. он проверяет корректность приведения...
объясните пожалуйста в чем проблема?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2014, 22:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ох уж этот полиморфизм (C++):

Полиморфизм - C++
Здравствуйте :) Я пытался читать про полиморфизм. Читал-читал, но не очень дошло. Понял, что можно переопределить виртуальную функцию...

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

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

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

Полиморфизм - C++
Всем доброго времени суток, Разъясните пожалуйста задание: Создать класс живущих с местоположением . Определить наследуемые классы -...

Полиморфизм - C++
Сколько я не читал книг и уроков по С++-программированию, я так и не смог понять что такое полиморфизм. Можно ли как-то просто и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Меорн
74 / 59 / 29
Регистрация: 01.02.2014
Сообщений: 203
01.02.2014, 22:50 #2
что-то я не то написал.
0
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 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.
1
IloveOOP
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 19
01.02.2014, 22:52  [ТС] #4
так и происходит. element-базовый класс,он и храниться в списке; я хочу получить производный.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
01.02.2014, 22:55 #5
IloveOOP, и виртуальных методов конечно нет? Нужен хотя бы виртуальный деструктор.
1
IloveOOP
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 19
01.02.2014, 23:00  [ТС] #6
не подскажите ещё почему в случае подобного приведения я теряю доступ к защищённым и закрытым членам? т.е. tableProcedure* tp= dynamic_cast<tableProcedure*>(*I) не будет иметь доступ ко всем своим членам
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
01.02.2014, 23:07 #7
IloveOOP, не понял, к "своим" - каким своим? Пример можно?
1
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"
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
01.02.2014, 23:16 #9
IloveOOP, так это и без dynamic_cast нельзя, защищённые члены доступны только членам класса, его наследникам и друзьям, закрытые - только членам и друзьям класса.
1
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;
}
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
01.02.2014, 23:44 #11
Buckstabue, о таком.
0
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
01.02.2014, 23:52 #12
Короче, как я понял, для использования dynamic_cast требуется определить хотя бы один виртуальный метод
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2014, 23:52
Привет! Вот еще темы с ответами:

Полиморфизм - C++
Прочитал в Википедии что такое полиморфизм: Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». ...

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.02.2014, 23:52
Ответ Создать тему
Опции темы

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