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

как узнать,является данный объект класса А1 наследником класса А2 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
dqrest
2 / 2 / 0
Регистрация: 06.01.2012
Сообщений: 114
21.12.2012, 12:03     как узнать,является данный объект класса А1 наследником класса А2 #1
Всем привет)есть классы S, A1, A2, B1, B2. Иерархия наследования следующая
S - Является родителем для всех классов и он имеет чисто виртуальную функцию
S -> B1 -> B2
S -> A1 -> A2
C++
1
2
3
4
5
6
7
8
9
#include <stdio.h>
void main()
{
   B2 * b2 = new B2();
   A2 * a2 = new A2();
   S * s1 = a2;
   //вопрос? как узнать, является ли объект по указателю s1 наследником класса A2 или не является наследником B2?
   
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2012, 12:03     как узнать,является данный объект класса А1 наследником класса А2
Посмотрите здесь:

В конструктор класса передать объект этого класса C++
C++ Ошибка компиляции (преобразование объекта класса в объект другого класса)
C++ Индексация массива класса, через объект этого класса
Как скопировать объект класса C++
Создание статической функции класса, которая принимает экземпляр этого же класса как объект C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.12.2012, 13:19     как узнать,является данный объект класса А1 наследником класса А2 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <type_traits>
 
class S {};
class A1: public S {};
class A2: public A1 {};
class B1: public S {};
class B2: public B1 {};
 
int main()
{
    std::cout << std::boolalpha;
    std::cout << "is_base_of:" << std::endl;
    std::cout << "A1, A2: " << std::is_base_of<A1,A2>::value << std::endl;
    std::cout << "B1, A2: " << std::is_base_of<B1,A2>::value << std::endl;
    std::cout<<"\n\n";
    system("pause");
    return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.12.2012, 13:27     как узнать,является данный объект класса А1 наследником класса А2 #3
Цитата Сообщение от yuron_477 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
#include <type_traits> 
class S {};
 class A1: public S {};
 class A2: public A1 {};
 class B1: public S {};
 class B2: public B1 {}; 
int main() {
 std::cout << std::boolalpha; 
std::cout << "is_base_of:" << std::endl; 
std::cout << "A1, A2: " << std::is_base_of<A1,A2>::value << std::endl;
 std::cout << "B1, A2: " << std::is_base_of<B1,A2>::value << std::endl;
 std::cout<<"\n\n"; 
system("pause"); 
return 0; 
}
Здорово! Не знал о таком. Но тут же напрашивается вопрос: Каков будет результат?
C++
1
std::cout << "S, B2: " << std::is_base_of<S,B2>::value << std::endl;
Байт
 Аватар для Байт
13987 / 8818 / 1230
Регистрация: 24.12.2010
Сообщений: 15,973
21.12.2012, 13:38     как узнать,является данный объект класса А1 наследником класса А2 #4
Стало интересно. Вот нагуглил
http://ru.cppreference.com/w/cpp/types/is_base_of
Но там написано - начиная с С++11...
В Qt есть такой метод inherits (для тех кто произведен от QObject)
А если проще?
C++
1
 if (static_cast<S *>  (a2)) != NULL) ...
Это, кажется, всюду должно работать...
dqrest
2 / 2 / 0
Регистрация: 06.01.2012
Сообщений: 114
21.12.2012, 13:39  [ТС]     как узнать,является данный объект класса А1 наследником класса А2 #5
Цитата Сообщение от yuron_477 Посмотреть сообщение
C++
1
#include <type_traits>
а эта библиотека откуда пришла???она не подключается!!!Она из фреймворка что ли?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.12.2012, 13:49     как узнать,является данный объект класса А1 наследником класса А2 #6
В задании сказано про объекты классов, а не про сами классы.

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
#include <iostream>
 
 
class S {
 public:
   virtual int get() = 0;
};
 
class A1 : public S {
 public:
   virtual int get() {
      return a1;
   }
   
 private:
   int a1;
};
 
class A2 : public A1 {
 public:
   virtual int get() {
      return a2;
   }
 
 private:
   int a2;
};
 
int main() {
   A1 *a1 = new A1();
   A1 *a2 = new A2();
 
   A2 *test = 0;
 
   test = dynamic_cast< A2 * >( a1 );
 
   if ( test != 0 )
      std::cout << "a1 is A2 object" << std::endl;
   else
      std::cout << "a1 is not A2 object" << std::endl;
 
   test = dynamic_cast< A2 * >( a2 );
 
   if ( test != 0 )
      std::cout << "a2 is A2 object" << std::endl;
   else
      std::cout << "a2 is not A2 object" << std::endl;
 
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2012, 14:07     как узнать,является данный объект класса А1 наследником класса А2
Еще ссылки по теме:

C++ Создать объект внутри класса, который может вызывать функцию этого класса
Указатель на объект базового класса и адрес объекта производного класса C++
Как создать объект класса в потоке? C++

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.12.2012, 14:07     как узнать,является данный объект класса А1 наследником класса А2 #7
Цитата Сообщение от dqrest Посмотреть сообщение
а эта библиотека откуда пришла???она не подключается!!!Она из фреймворка что ли?
Она включена в C++11. Надо иметь соответствующий компилятор. Кое что можно почитать здесь: http://www.cplusplus.com/reference/type_traits/
Yandex
Объявления
21.12.2012, 14:07     как узнать,является данный объект класса А1 наследником класса А2
Ответ Создать тему
Опции темы

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