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

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

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

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

11.07.2016, 12:56. Просмотров 205. Ответов 4
Метки нет (Все метки)

Создать иерархию классов 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;
}
помощью
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2016, 12:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование типов с использованием dynamic_cast (C++):

Нюанс с dynamic_cast: может ли указанное приведение типов быть корректным? - C++
Может ли такое приведение типов (второй dynamic_cast) быть корректным?:class A {public: virtual ~A() {}}; class B : private virtual A...

Преобразование типов - C++
Вопрос по преобразованию строки в число , и наоборот . Например на форме расположен MaskedTextBox , Button и Label . Как при нажатии на...

Преобразование типов - C++
Как преобразовать массив char message в строку char *strmessage ?????

Преобразование типов - C++
С учебника переписал код на применение структур, но возникла проблема с преобразованием типов. Вот код проги: #include &quot;stdafx.h&quot; ...

Преобразование типов. - C++
Подскажите как правильно преобразовать типы в следующем фрагменте: int i; i=GetKeyboardType(0); reinterpret_cast &lt;char&gt; (i); ...

преобразование типов - C++
Здравствуйте, подскажите пожалуйста как преобразовать данные типа LPARAM в LPCWSTR

4
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,213
Записей в блоге: 27
11.07.2016, 13:11 #2
sergentiy, код ошибки сюда.

Добавлено через 8 минут
sergentiy, ладно, пока Вы лихорадочно ищете код ошибки(я надеюсь), выскажу предположения.
Во-первых
C++
1
daddy = dynamic_cast<Daddy*>(&grandpa[1]);
Во-вторых...
Попытка каких-то действий с элементом daddy... А он ведь и не создан. Так же как и son.
1
Anglues113
0 / 0 / 0
Регистрация: 09.07.2016
Сообщений: 5
11.07.2016, 13:40 #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
0
Хрисипп
19 / 29 / 8
Регистрация: 09.02.2016
Сообщений: 217
11.07.2016, 13:54 #4
так не нужно делать. делайте так
C++
1
daddy = (Daddy*)(&grandpa[1])
Добавлено через 6 минут
dynamic_cast вы можете использовать только делая наоборот
C++
1
grandpa=dynamic_cast<Grandpa*>(&daddy)
и то это излишество, когда можно просто так
C++
1
grandpa=&daddy
0
sergentiy
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 46
11.07.2016, 14:16  [ТС] #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;
}
0
11.07.2016, 14:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2016, 14:16
Привет! Вот еще темы с ответами:

Преобразование типов - C++
есть следующая маленькая программка #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { int oldFunt,...

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

Преобразование типов - C++
Увидел код в сети, решил откомпилировать. Думаю какой код не важно. вылезла куча ошибок. на это LPSTR ActW = new TCHAR; ругается с...

Преобразование типов - C++
Возможно ли преобразовать vector &lt;Transport_Vehicle*&gt; Cars_for_transportation в vector &lt;MotorCar*&gt; Cars_for_transportation


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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