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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
dqrest
2 / 2 / 0
Регистрация: 06.01.2012
Сообщений: 114
#1

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

21.12.2012, 12:03. Просмотров 1175. Ответов 6
Метки нет (Все метки)

Всем привет)есть классы 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++
Объект класса string не является однозначным C++
C++ Использование конструктора базового класса наследником
C++ Запрет shared_ptr быть наследником определённого класса
C++ Вызов динамического метода класса по указателю на объект класса
C++ Индексация массива класса, через объект этого класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1428 / 765 / 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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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;
Байт
Эксперт C
15636 / 9978 / 1499
Регистрация: 24.12.2010
Сообщений: 18,742
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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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++
Как скопировать объект класса C++
Ссылка на объект как свойство класса C++

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

Или воспользуйтесь поиском по форуму:
DiffEreD
1428 / 765 / 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
Ответ Создать тему
Опции темы

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