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

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

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

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

21.12.2012, 12:03. Просмотров 1254. Ответов 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?
   
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2012, 12:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как узнать,является данный объект класса А1 наследником класса А2 (C++):

Как обратится к обьекту класса, являющегося наследником абстрактного класса - C++
Здравствуйте! У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на...

Как проверить является ли объект базовым классом или наследником - C++
struct Base { int i = -1; }; struct Derived : Base { double d = 0.1; };

Создание статической функции класса, которая принимает экземпляр этого же класса как объект - C++
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt; endl; this-&gt;setName(); //все...

Объект класса string не является однозначным - C++
Вот ошибка: Ошибка 1 error C2872: left: неоднозначный символ c:\users\м\desktop\documents\visual studio 2013\projects\млита\млита\метод...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? - C++
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.12.2012, 13:19 #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;
}
3
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
21.12.2012, 13:27 #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;
0
Байт
Эксперт C
16062 / 10331 / 1540
Регистрация: 24.12.2010
Сообщений: 19,468
21.12.2012, 13:38 #4
Стало интересно. Вот нагуглил
http://ru.cppreference.com/w/cpp/types/is_base_of
Но там написано - начиная с С++11...
В Qt есть такой метод inherits (для тех кто произведен от QObject)
А если проще?
C++
1
 if (static_cast<S *>  (a2)) != NULL) ...
Это, кажется, всюду должно работать...
0
dqrest
2 / 2 / 0
Регистрация: 06.01.2012
Сообщений: 114
21.12.2012, 13:39  [ТС] #5
Цитата Сообщение от yuron_477 Посмотреть сообщение
C++
1
#include <type_traits>
а эта библиотека откуда пришла???она не подключается!!!Она из фреймворка что ли?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
21.12.2012, 13:49 #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;
}
1
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.12.2012, 14:07 #7
Цитата Сообщение от dqrest Посмотреть сообщение
а эта библиотека откуда пришла???она не подключается!!!Она из фреймворка что ли?
Она включена в C++11. Надо иметь соответствующий компилятор. Кое что можно почитать здесь: http://www.cplusplus.com/reference/type_traits/
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2012, 14:07
Привет! Вот еще темы с ответами:

Использование конструктора базового класса наследником - C++
Доброго дня, коллеги! Решал одну задачку и столкнулся с проблемой. По условию дан класс String, моделирующий работу типа данных string....

Запрет shared_ptr быть наследником определённого класса - C++
Добрый день, #include &lt;memory&gt; class A { }; class B : public A {

Ошибка компиляции (преобразование объекта класса в объект другого класса) - C++
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции... Прога преобразует доллары США в старые Британские фунты. Но...

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.12.2012, 14:07
Ответ Создать тему
Опции темы

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