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

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

10.09.2016, 18:37. Просмотров 850. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

5
DrOffset
8012 / 4649 / 1131
Регистрация: 30.01.2014
Сообщений: 7,555
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 / 0
Регистрация: 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
8012 / 4649 / 1131
Регистрация: 30.01.2014
Сообщений: 7,555
10.09.2016, 19:44 #4
Цитата Сообщение от cyberk20 Посмотреть сообщение
Я читал статью об ООП
Я твердо убежден, что новичок, читая подобное, должен быть достаточно разумен, чтобы не воспринимать написанное как догму. Хоть это порой очень соблазнительно: когда что-то ругают, легче проникнуться, особенно если это правильно подано. Однако, начитавшись подобного на ранних этапах, можно настолько забить себе голову чужими субъективными выводами, что впоследствии не только не будет желания разобраться и найти свою истину, но и вообще возвращаться к рассмотрению этого вопроса - "я же состоявшийся специалист", - скажет себе такой человек, "зачем мне пересматривать свои взгляды?". Поэтому - осторожнее, подобные статьи опасны для профессионального роста, даже если в них есть зерна истины.

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