Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
4 / 4 / 0
Регистрация: 06.01.2012
Сообщений: 117

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

21.12.2012, 12:03. Показов 7495. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2012, 12:03
Ответы с готовыми решениями:

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

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

Можно ли создать объект класса с таким же именем как у самого класса?
Можно ли создать объект класса с таким же именем как у самого класса? Ну или как то обойти эту проблему?

6
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.12.2012, 13:19
Лучший ответ Сообщение было отмечено как решение

Решение

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
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
21.12.2012, 13:27
Цитата Сообщение от 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
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
21.12.2012, 13:38
Стало интересно. Вот нагуглил
http://ru.cppreference.com/w/cpp/types/is_base_of
Но там написано - начиная с С++11...
В Qt есть такой метод inherits (для тех кто произведен от QObject)
А если проще?
C++
1
 if (static_cast<S *>  (a2)) != NULL) ...
Это, кажется, всюду должно работать...
0
4 / 4 / 0
Регистрация: 06.01.2012
Сообщений: 117
21.12.2012, 13:39  [ТС]
Цитата Сообщение от yuron_477 Посмотреть сообщение
C++
1
#include <type_traits>
а эта библиотека откуда пришла???она не подключается!!!Она из фреймворка что ли?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
21.12.2012, 13:49
В задании сказано про объекты классов, а не про сами классы.

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
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.12.2012, 14:07
Цитата Сообщение от dqrest Посмотреть сообщение
а эта библиотека откуда пришла???она не подключается!!!Она из фреймворка что ли?
Она включена в C++11. Надо иметь соответствующий компилятор. Кое что можно почитать здесь: http://www.cplusplus.com/reference/type_traits/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2012, 14:07
Помогаю со студенческими работами здесь

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект базового класса, а ves- производного ...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru