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

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

Восстановить пароль Регистрация
 
IloveOOP
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 19
01.02.2014, 22:40     ох уж этот полиморфизм #1
Добрый день. имеются классы:
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++
C++ полиморфизм
C++ Полиморфизм
C++ Полиморфизм
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Меорн
74 / 59 / 29
Регистрация: 01.02.2014
Сообщений: 201
01.02.2014, 22:50     ох уж этот полиморфизм #2
что-то я не то написал.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
01.02.2014, 23:16     ох уж этот полиморфизм #9
IloveOOP, так это и без dynamic_cast нельзя, защищённые члены доступны только членам класса, его наследникам и друзьям, закрытые - только членам и друзьям класса.
Buckstabue
 Аватар для 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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++

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

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

Текущее время: 11:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru