Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
cyberk20
0 / 0 / 1
Регистрация: 04.12.2015
Сообщений: 21
#1

Как проверить является ли объект базовым классом или наследником - C++

10.09.2016, 18:37. Просмотров 326. Ответов 5
Метки нет (Все метки)

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
struct Base
{
   int i = -1;
};
 
struct Derived : Base
{
   double d = 0.1;
};
 
void fVal(Base b)
{
   cout << __FUNCTION__ << " " << b.i << endl;
}
 
void fPoi(Base * b)
{
   cout << __FUNCTION__ << " " << b->i++ << endl;
}
 
void fRef(Base & b)
{
   cout << __FUNCTION__ << " " << b.i++ << endl;
}
 
int main()
{ 
   Derived d;
   fVal(d);
   fPoi(&d);
   fRef(d);
 
   return 0;
}
Здравствуйте, скажите пожалуйста можно ли как-то проверить в функциях fVal/Poi/Ref что передаваемый по значению\указателю\ссылке аргумент действительно является объектом класса Base, а не производных от него?
Спасибо!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2016, 18:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как проверить является ли объект базовым классом или наследником (C++):

Invalid_argument не является базовым классом
Всмысле? Как так? В заголовочном файле определяю наследование своего...

Проверить, каким классом наследником помечен элемент общего (наследующего) массива
подскажите как можно, и можно ли проверить, каким классом наследником помечен...

как узнать,является данный объект класса А1 наследником класса А2
Всем привет)есть классы S, A1, A2, B1, B2. Иерархия наследования следующая ...

Создать иерархию наследования с абстрактным базовым классом
Доброго времени суток! Помогите, пожалуйста, сделать: 2) Создать абстрактный...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что...

Проверить, является ли слово или число палиндромом
Проверить является слово или число палиндромом. Если можно с объяснением....

5
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.09.2016, 19:05 #2
Лучший ответ Сообщение было отмечено cyberk20 как решение

Решение

cyberk20,
В порядке шутки:
Кликните здесь для просмотра всего текста

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
struct Base
{
   int i = -1;
};
 
struct Derived : Base
{
   double d = 0.1;
};
 
void fVal(Base b, bool isBase)
{
   cout << __FUNCTION__ << "is base: " << isBase << " " << b.i << endl;
}
 
void fPoi(Base * b, bool isBase)
{
   cout << __FUNCTION__ << "is base: " << isBase << " " << b->i++ << endl;
}
 
void fRef(Base & b, bool isBase)
{
   cout << __FUNCTION__ << "is base: " << isBase << " " << b.i++ << endl;
}
 
template <typename T, typename F>
void checkedCall(F f, T && x)
{
    using Ta = typename std::remove_reference<T>::type;
 
    f(x, std::is_same<Ta,
            typename std::conditional<
                std::is_pointer<Ta>::value, Base *, Base
            >::type
         >::value);
}
 
int main()
{
   Derived d;
   checkedCall(fVal, d);
   checkedCall(fPoi, &d);
   checkedCall(fRef, d);
 
   Base b;
   checkedCall(fVal, b);
   checkedCall(fPoi, &b);
   checkedCall(fRef, b);
}


А если серьезно, то очень похоже, что ты делаешь что-то не так.
1
cyberk20
0 / 0 / 1
Регистрация: 04.12.2015
Сообщений: 21
10.09.2016, 19:36  [ТС] #3
Цитата Сообщение от DrOffset Посмотреть сообщение
А если серьезно, то очень похоже, что ты делаешь что-то не так.
Я читал статью об ООП, в которой критиковалось наследование: https://habrahabr.ru/post/147927/ и в частности упоминалось что нет возможности проверить является ли тип объекта классом X или классом наследником.
Спасибо.

Добавлено через 20 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
2
3
template <typename T, typename F>
void checkedCall(F f, T && x);
}
Скажите пожалуйста ещё почему вы использовали rvalue аргумент T && x ?
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.09.2016, 19:44 #4
Цитата Сообщение от cyberk20 Посмотреть сообщение
Я читал статью об ООП
Я твердо убежден, что новичок, читая подобное, должен быть достаточно разумен, чтобы не воспринимать написанное как догму. Хоть это порой очень соблазнительно: когда что-то ругают, легче проникнуться, особенно если это правильно подано. Однако, начитавшись подобного на ранних этапах, можно настолько забить себе голову чужими субъективными выводами, что впоследствии не только не будет желания разобраться и найти свою истину, но и вообще возвращаться к рассмотрению этого вопроса - "я же состоявшийся специалист", - скажет себе такой человек, "зачем мне пересматривать свои взгляды?". Поэтому - осторожнее, подобные статьи опасны для профессионального роста, даже если в них есть зерна истины.

Добавлено через 1 минуту
Цитата Сообщение от cyberk20 Посмотреть сообщение
Скажите пожалуйста ещё почему вы использовали rvalue аргумент T && x ?
В данном контексте rvalue-ref используется в значении "универсальная ссылка". Можно подробнее почитать у Мейерса в новой книге по С++11.
1
cyberk20
0 / 0 / 1
Регистрация: 04.12.2015
Сообщений: 21
10.09.2016, 19:53  [ТС] #5
Цитата Сообщение от DrOffset Посмотреть сообщение
Я твердо убежден, что новичок, читая подобное, должен быть достаточно разумен, чтобы не воспринимать написанное как догму. Хоть это порой очень соблазнительно: когда что-то ругают, легче проникнуться, особенно если это правильно подано. Однако, начитавшись подобного на ранних этапах, можно настолько забить себе голову чужими субъективными выводами, что впоследствии не только не будет желания разобраться и найти свою истину, но и вообще возвращаться к рассмотрению этого вопроса - "я же состоявшийся специалист", - скажет себе такой человек, "зачем мне пересматривать свои взгляды?". Поэтому - осторожнее, подобные статьи опасны для профессионального роста, даже если в них есть зерна истины.
Согласен.
0
hoggy
Заблокирован
10.09.2016, 19:56 #6
Цитата Сообщение от cyberk20 Посмотреть сообщение
в которой критиковалось наследование:
статью писал балбес.

Цитата Сообщение от cyberk20 Посмотреть сообщение
в частности упоминалось что нет возможности проверить является ли тип объекта классом X или классом наследником.
особое внимание уделите примеру использования.
http://ru.cppreference.com/w/cpp/types/is_base_of
1
10.09.2016, 19:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2016, 19:56
Привет! Вот еще темы с решениями:

Проверить, является ли последовательность прогрессией или нет?
Дан последовательность из N целых чисел (N задаётся с клавиатуры). Проверить,...

Проверить, является ли матрица A(n,n) диагональной, единичной или нулевой
Проверить, является ли матрица A(n,n) диагональной (все элементы нули, кроме...

Проверить, является ли введенное значение числом или нет
Здрасти. как проверить число на то, является ли оно им или нет. Пробовал с...

Проверить является ли введенное слово или число палиндромом
Требуется написать функцию, которая проверяет введенное слово или число, на то...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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