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

typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения - C++

Восстановить пароль Регистрация
 
RoastedBard
 Аватар для RoastedBard
0 / 0 / 0
Регистрация: 06.09.2012
Сообщений: 10
16.09.2012, 20:10     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения #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
72
73
#include <iostream>
#include <string>
#include <conio.h>
#include <windows.h>
#include <typeinfo>
 
using namespace std;
 
struct Human
{
    string name;
};
 
    struct Student : Human
    {
        Student()
        {
            name="Студент";
        }
    };
 
    struct Dekan : Human
    {
        Dekan()
        {
            name="Декан";
        }
    };
 
    struct Rektor : Human
    {
        Rektor()
        {
            name="Ректор";
        }
    };
 
int main()
{
    ::SetConsoleCP(::GetACP());
    ::SetConsoleOutputCP(::GetACP());
    int choise;
    Human *h;
    
    cout<<"1)Создать ректора\n";
    cout<<"2)Создать декана\n";
    cout<<"3)Создать студента\n";
    cout<<">Ваш выбор: ";
    cin>>choise;
 
    switch(choise)
    {
    case 1:
        h=new Rektor();
        break;
    case 2:
        h=new Dekan();
        break;
    case 3:
        h=new Student();
        break;
    }
 
    if(typeid(h)==typeid(Rektor))
        cout<<"Вы создали ректора\n";
    if(typeid(h)==typeid(Dekan))
        cout<<"Вы создали декана\n";
    if(typeid(h)==typeid(Student))
        cout<<"Вы создали студента\n";
    
    _getch();
    return 0;
}
Тип переменной h всегда определяет как Human*. Подскажите пожалуйста, как в данном конкретном случае сделать, чтобы типы определялись корректно(т.е если я создал ректора то тип должен быть Rektor и т.д)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2012, 20:10     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения
Посмотрите здесь:

Абстрактный базовый класс "звонок" с виртуальной функцией "стоимость" C++
C++ Описать базовый класс "книга"
C++ Опишите абстрактный базовый класс "строка",реализующий методы ввода-вывода строки
C++ Разрабатывать базовый класс "Станки"
Как при помощи указателя на базовый класс обратится к полю наследуемого класса? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
16.09.2012, 20:29     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения #2
typeid() возвращает тебе тип h, который совершенно четко является Human*, так что все верно. А ты пытаешься сравнить тип указателя с обычным типом.
Добавь разыменование внутри typeid - получишь реальный тип полиморфного объекта.
C++
1
2
3
4
Human* h = new Student();
if ( typeid( *h ) == typeid( student ) ) {
    // Будет true
}
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
16.09.2012, 20:54     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения #3
Добавь в структуру Human виртуальный метод
RoastedBard
 Аватар для RoastedBard
0 / 0 / 0
Регистрация: 06.09.2012
Сообщений: 10
16.09.2012, 21:02  [ТС]     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения #4
Цитата Сообщение от Герц Посмотреть сообщение
Добавь разыменование внутри typeid - получишь реальный тип полиморфного объекта.
C++
1
2
3
4
Human* h = new Student();
if ( typeid( *h ) == typeid( student ) ) {
    // Будет true
}
Уже пробовал. В таком случае typeid() возвращает Human вместо Human* и всё.

Цитата Сообщение от igorrr37 Посмотреть сообщение
Добавь в структуру Human виртуальный метод
Поясните пожалуйста.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
16.09.2012, 21:09     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения #5
Цитата Сообщение от RoastedBard Посмотреть сообщение
Поясните пожалуйста.
У тебя объект не полиморфный, тем более ты хранишь поле name, заполняемое в разных классах по-разному, зачем тебе typeid тогда вообще?
C++
1
2
3
4
5
struct Human
{
    // ...
    virtual ~Human() {};
};
RoastedBard
 Аватар для RoastedBard
0 / 0 / 0
Регистрация: 06.09.2012
Сообщений: 10
16.09.2012, 21:49  [ТС]     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения #6
Герц, спасибо большое, всё заработало)
По поводу зачем typeid() :
в моём листинге приведён всего лишь пример, моделирующий проблему с которой я столкнулся. И поле name нужно всего лишь для проверки, т.е. работает ли присваивание вообще. Сама проблема связано именно с typeid(). Но теперь она решена!
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
16.09.2012, 22:16     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения #7
В любом случае сравнивать typeid( T* ) с typeid( T ) как-то не слишком логично.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2012, 22:31     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения
Еще ссылки по теме:

C++ Создать базовый класс "транспортное средство"
Базовый класс "Строка" отказывается работать C++
C++ Базовый класс "Летательный аппарат" и производные классы Ракета и Самолет

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.09.2012, 22:31     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения #8
А ещё сравнение typeid потенциально медленное. Не знаю, как в Студии, но g++ его делает, сравнивая строки с именами.
Yandex
Объявления
16.09.2012, 22:31     typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения
Ответ Создать тему
Опции темы

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