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

Преобразование типов с использованием dynamic_cast - C++

Восстановить пароль Регистрация
 
sergentiy
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 39
11.07.2016, 12:56     Преобразование типов с использованием dynamic_cast #1
Создать иерархию классов Grandpa-> Daddy-> Son.
o Класс Grandpa имеет виртуальную функцию Sleep().
o Класси Daddy та Son имеют виртуальные функции Walk().
o Клас Son имеет виртуальную функцию Play().
Создать массив указателей на базовий класс.
Написать глобальную функцию, которая получает массив указателей на объекты и для каждого объекта вызываетправильний набор виртуальных методов.
Использовать операцию dynamic_cast < >.

Я пока пишу в main, в функцию потом закину. Не получается преобразовать элемент массива. Когда пишу индекс массива daddy = dynamic_cast<Daddy*>(grandpa[1]); возникает ошибка. Помогите разобраться пожалуйста.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
 
using namespace std;
 
class Grandpa
{
    string name;
public:
    Grandpa()
    {
        name = "Ivan";
    }
 
    Grandpa(string name)
    {
        this->name = name;
    }
 
    virtual void Sleep()
    {
        cout << "sleep" << endl;
    }
};
 
class Daddy : public Grandpa
{
public:
    Daddy(string name) : Grandpa (name){}
 
    virtual void Walk()
    {
        cout << "walk daddy" << endl;
    }
};
 
class Son : public Daddy
{
public:
    Son(string name) : Daddy(name){ }
 
    virtual void Walk()
    {
        cout << "walk son" << endl;
    }
 
    virtual void Play()
    {
        cout << "play" << endl;
    }
};
 
int main()
{
    int N = 3;
    Grandpa* grandpa = new Grandpa[N];
    
 
    grandpa[0].Sleep();
 
    Daddy* daddy;
    daddy = dynamic_cast<Daddy*>(grandpa[1]); // допоможіть будь-ласка, в чому тут помилка та як її вирішити?
    daddy->Sleep();
    daddy->Walk();
 
    Son* son;
    son = dynamic_cast<Son*>(grandpa);
    son->Play();
    son->Sleep();
    son->Walk();
    return 0;
}
помощью
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2016, 12:56     Преобразование типов с использованием dynamic_cast
Посмотрите здесь:

C++ Преобразование типов
Преобразование типов C++
C++ преобразование типов
Преобразование типов. C++
C++ Преобразование типов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
11.07.2016, 13:11     Преобразование типов с использованием dynamic_cast #2
sergentiy, код ошибки сюда.

Добавлено через 8 минут
sergentiy, ладно, пока Вы лихорадочно ищете код ошибки(я надеюсь), выскажу предположения.
Во-первых
C++
1
daddy = dynamic_cast<Daddy*>(&grandpa[1]);
Во-вторых...
Попытка каких-то действий с элементом daddy... А он ведь и не создан. Так же как и son.
Anglues113
0 / 0 / 0
Регистрация: 09.07.2016
Сообщений: 5
11.07.2016, 13:40     Преобразование типов с использованием dynamic_cast #3
C++
1
2
3
4
5
6
7
Grandpa * grandpa[3] = { new Grandpa(), new Daddy(string("Daddy")), new Son(string("Son")) };
 
    grandpa[0]->Sleep();
    dynamic_cast<Daddy*>(grandpa[1])->Walk();
    dynamic_cast<Son*>(grandpa[2])->Play();
    for (int i = 0; i < 3; i++)
        delete grandpa[i];
Добавлено через 11 минут
Так же советую конструктор со стрингами делать так
Grandpa(const string & name = string()) - тут и конструктор без параметров который сделает пустую строку через стандартный конструктор string и конструктор с параметром string
Хрисипп
 Аватар для Хрисипп
17 / 27 / 8
Регистрация: 09.02.2016
Сообщений: 212
11.07.2016, 13:54     Преобразование типов с использованием dynamic_cast #4
так не нужно делать. делайте так
C++
1
daddy = (Daddy*)(&grandpa[1])
Добавлено через 6 минут
dynamic_cast вы можете использовать только делая наоборот
C++
1
grandpa=dynamic_cast<Grandpa*>(&daddy)
и то это излишество, когда можно просто так
C++
1
grandpa=&daddy
sergentiy
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 39
11.07.2016, 14:16  [ТС]     Преобразование типов с использованием dynamic_cast #5
вроде написал, всем спасибо!
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
 
using namespace std;
 
class Grandpa
{
    string name;
public:
    Grandpa()
    {
        name = "Ivan";
    }
 
    Grandpa(string name)
    {
        this->name = name;
    }
 
    virtual void Sleep()
    {
        cout << "sleep" << endl;
    }
};
 
class Daddy : public Grandpa
{
public:
    Daddy(string name) : Grandpa (name){}
 
    virtual void Walk()
    {
        cout << "walk daddy" << endl;
    }
};
 
class Son : public Daddy
{
public:
    Son(string name) : Daddy(name){ }
 
    virtual void Walk()
    {
        cout << "walk son" << endl;
    }
 
    virtual void Play()
    {
        cout << "play" << endl;
    }
};
 
void Func(Grandpa** grandpa)
{
    grandpa[0]->Sleep();
    cout << endl << endl;
 
    Daddy* daddy;
    daddy = dynamic_cast<Daddy*>(grandpa[1]);
    daddy->Sleep();
    daddy->Walk();
    cout << endl << endl;
 
    Son* son;
    son = dynamic_cast<Son*>(grandpa[2]);
    son->Play();
    son->Sleep();
    son->Walk();
}
 
int main()
{
    int N = 3;
    Grandpa** grandpa = new Grandpa*[N] {new Grandpa, new Daddy("Petro"), new Son("Igor")};
 
    Func(grandpa);
    
 
    
    return 0;
}
Yandex
Объявления
11.07.2016, 14:16     Преобразование типов с использованием dynamic_cast
Ответ Создать тему
Опции темы

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