Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как у класса узнать его базовый класс  (Прочитано 14768 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Anonymous
Гость
« : 30-06-2004 00:03 » 

Люди подскажите как получить базовый класс
Есть класс  (class C) надо изнать его базовый(от которого он создан его)
 класс самого первого уровня (class A)
Записан
Serega
Гость
« Ответ #1 : 30-06-2004 08:58 » 

Узнать никак не выдет, в С++ нет поддержки описания классов
Есть RTTI, но сервисов там минимум

Можно проверить унаследован ли данный обьект от определенного класса, есть два способа:
Первый способ - во время работы программы
Код:
class A
{
public:
virtual ~A() {}
};

class B : public A {};

class C
{
public:
virtual ~C() {}
};

void Test()
{
A a;
B b;
C c;

A* ptr;

ptr = dynamic_cast<A*>(&a);
// пытаемся безопасно привести &a к типу A*

assert( ptr != null );
// ptr != null, т.к. &a можно привести к A*

ptr = dynamic_cast<A*>(&b);
// пытаемся безопасно привести &b к типу A*

assert( ptr != null );
// ptr != null, т.к. &b можно привести к A*
// потому что B унаследован от A

ptr = dynamic_cast<A*>(&c);
// пытаемся безопасно привести &c к типу A*

assert( ptr != null ); // ошибка !!!
// ptr == null, т.к. &c не возможно привести к A*
// потому что С не наследует от A
}
использовать можно как указатели так и ссылки
Код:
A& ref = dynamic_cast<A&>(a);
assert( &ref != null );

Воторой способ - это проверка на этапе компиляции
вместо dynamic_cast используем static_cast
Код:
ptr = static_cast<A*>(&c);
// пытаемся безопасно привести &c к типу A*
в данном случае компилятор выдаст ошибку
« Последнее редактирование: 29-11-2007 15:26 от Алексей1153++ » Записан
Anonymous
Гость
« Ответ #2 : 04-07-2004 22:08 » 

Serega

А как же Mfc классы контролов могут
возращать свой базовый класс CWnd
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #3 : 05-07-2004 09:26 » 

они как правило возвращают указатель на себя(this), а ты его уже переопределяешь в указатель на базовый.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Serega
Гость
« Ответ #4 : 05-07-2004 11:43 » 

Код:
class CWnd {};

class MyControl : CWnd
{
CWnd* getWnd() { return this; }
};
В данном случае происходит неявное преобразование типов, НО компилятор знает что MyControl производный от CWnd
если он этого не знал бы, ничего бы не вышло
Код:
class MyControl
{
CWnd* getWnd() { return this; }
};
так не выдет
« Последнее редактирование: 29-11-2007 15:29 от Алексей1153++ » Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #5 : 07-07-2004 02:51 » 

можно и так:
return (CWnd*) this ;
Записан

1n c0de we trust
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 08-07-2004 08:54 » 

нет так нельзя... так компилятор НИЧЕГО НЕ ГАРАНТИРУЕТ вот пример

Код:
class MyControl
{
    CWnd * getWnd();
};

CWnd * MyControl::getWnd()
{
    int a = 10;
    return (CWnd *)&a;
}

и компилится как часы, но при работе... большой бум-бум обеспечен
« Последнее редактирование: 29-11-2007 15:30 от Алексей1153++ » Записан

С уважением Lapulya
Mayor
Специалист

ru
Offline Offline

« Ответ #7 : 10-07-2004 00:24 » 

ЭЭЭЭ вообще-то как может this ссылааться на int Улыбаюсь
Записан

1n c0de we trust
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #8 : 10-07-2004 08:51 » 

Цитата
ЭЭЭЭ вообще-то как может this ссылааться на int
Я не очень понял что ты имеешь ввиду, но если ты сомневаешься что это компилится то просто проверь!!! колмпилятор скажет что этот код
Код:
class MyControl
{
    CWnd * getWnd();
};

CWnd * MyControl::getWnd()
{
    int a = 10;
    return (CWnd *)&a;
}
абсолютно корректен!!!
« Последнее редактирование: 29-11-2007 15:36 от Алексей1153++ » Записан

С уважением Lapulya
Anchorite
Гость
« Ответ #9 : 11-07-2004 20:30 » 

Mayor, где ты увидел this ссылающийся на int?
Там есть следующее: создается автоматическая переменная целого типа инициализированная 10. Потом берется указатель на нее и этот указатель преобразуется в указатель на CWnd.
Все эти операции совершенно корректны.
Вот только результат непредсказуем - возвращенный функцией указатель будет указывать неизвестно на что, т.к переменная "а" будет освобождена при выходе из функции.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #10 : 13-07-2004 02:42 » 

Да освобождения стековой переменной трудно отлаживать, но я имел ввиду зачем возвращать указатель на int вместо указателя на класс. Хотя конечно случаи всякие бывают, 0 указатель отлавить намного проще, чем указатель ссылающийся не на те данные, но это повлечет потерю производительности.

Гость, я не понял для чего тебе нужно получить базовый класс.
Записан

1n c0de we trust
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #11 : 15-07-2004 10:56 » 

Да какая разница локальная это переменная (это я про a) или нет, я мог бы и так написать
Код:
class MyControl
{
    CWnd * getWnd();
};

int * a = new int;
CWnd * MyControl::getWnd()
{
    *a = 10;
    return (CWnd *)a;
}
я это к тому писал что товарищ Mayor, предлагал сделать так
Цитата
можно и так:
return (CWnd*) this ;
так я ему пытался объяснить что такое приведение МЕНЕЕ предпочтительно, чем так
Цитата
Код:
class MyControl
{
   CWnd* getWnd() { return this; }
};
потому как проверка в последнем случае осуществляется компилятором, а в первом только самим программистом
« Последнее редактирование: 29-11-2007 15:38 от Алексей1153++ » Записан

С уважением Lapulya
Mayor
Специалист

ru
Offline Offline

« Ответ #12 : 17-07-2004 01:06 » 

А понятно - это все видимо потому что я проверять предпочитаю SoftICE Улыбаюсь
Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines