Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
1

Приведение указателей

24.07.2015, 20:02. Просмотров 635. Ответов 7
Метки нет (Все метки)

В функции в качестве параметра передаю указатель на один из самых базовых классов . Затем в функции вызываю функцию, которой нет в базовом классе, но которая есть в классе указатель на который я передаю в качестве параметра функции при вызове. А нужно это для того, чтобы вызвать функцию , но чтоб в качестве параметра передавать указатели на объекты разных классов.

C++
1
2
3
4
5
6
7
8
9
10
11
func(BaseClass *bC){
//много всякого кода
bC->func1(); //Этой функции нет в базовом классе.
return 1;
}
//Вызов функции
ChildClass1 *cC1;
ChildClass2 *cC2;
//приведение указателей 
func(cC1); //в этом классе имеется функция func1
func(cC2); //и в этом тоже
Компилятор ругается, пишет, что нет такой функции. Так можно вообще сделать?
На ум пришли несколько других вариантов, если что сделаю с помощью них.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2015, 20:02
Ответы с готовыми решениями:

Приведение указателей
Вопрос немного из другого раздела, но тем не менее, вопросы не по поводу WinApi, а поводу...

приведение типов указателей
Задача у меня простая. Нужно побитно оперировать с числом unsigned int и на каких-то этапах...

Приведение указателей в стиле си
Здравствуйте, это наверное самый дурацкий вопрос но что значит скобочки в c++ т.е вот например дан...

Отличие приведение типов указателей
Чем отличаются при Base* a_ptr = new Derivered(); следующие строки: A) auto ptr =...

7
Эксперт С++
1661 / 1033 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
24.07.2015, 20:05 2
Виртуальные функции придумали как раз для этого.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
24.07.2015, 20:09  [ТС] 3
Базовый класс не могу трогать. Он библиотечный. Получается нужно определить еще один класс в нем создать виртуальную функцию и эти два наследовать от него? Потом в них уже определить эту функцию
0
13712 / 7335 / 1751
Регистрация: 30.01.2014
Сообщений: 12,306
24.07.2015, 20:31 4
Цитата Сообщение от kolts Посмотреть сообщение
Базовый класс не могу трогать.
Можно сделать свой полиморфизм, с блекджеком
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
51
52
53
54
#include <boost/variant.hpp>
 
#include <iostream>
 
class Base
{
public:
    
    virtual ~Base() {}
};
 
class Derived : public Base
{
public:
    void foo() // в базовом такой нет
    {
        std::cout << "i am derived!\n";
    }
};
 
class call_visitor 
    : public boost::static_visitor<void>
{
public:
    void operator()(Derived * p) const
    {
        p->foo();
    }
    
    void operator()(Base * p) const
    { }
};
 
typedef boost::variant<Base*, Derived*> base_ptr_t;
 
void func(base_ptr_t bC)
{
    boost::apply_visitor(call_visitor(), bC);
}
 
int main()
{
    Base base;
    Derived derived;
    
    base_ptr_t p1 = &base;
    base_ptr_t p2 = &derived;
    
    func(p1);
    func(p2);
   
    std::cout << "base_ptr_t size: " << sizeof(base_ptr_t) << std::endl;
    std::cout << "void * size: " << sizeof(void *) << std::endl;
}
http://rextester.com/PFZKU92889
Оверхед по памяти - один лишний указатель.
Если буст нельзя, то можно на основе идеи написать свою миниреализацию под этот конкретный случай.
Или можно начать приседания с dynamic_cast - это самый быстрый вариант, если архитектура не была рассчитана на такое.
0
Эксперт С++
1661 / 1033 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
24.07.2015, 20:34 5
Цитата Сообщение от kolts Посмотреть сообщение
Получается нужно определить еще один класс в нем создать виртуальную функцию и эти два наследовать от него? Потом в них уже определить эту функцию.
Да, это сработает. Можно также рассмотреть включение библиотечного класса в производный не в качестве предка, а в качестве члена.
1
DrOffset
24.07.2015, 20:44
  #6

Не по теме:

Цитата Сообщение от kolts Посмотреть сообщение
Получается нужно определить еще один класс в нем создать виртуальную функцию и эти два наследовать от него?
Что-то я сперва это не заметил у тебя. Да, если это возможно, то лучше сделать так. Или как говорит Nick Alte с включением. Мой вариант - это экзотика.

0
4197 / 1790 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
24.07.2015, 20:47 7
Цитата Сообщение от kolts Посмотреть сообщение
но которая есть в классе указатель на который я передаю в качестве параметра функции при вызове.
Это исключается
Цитата Сообщение от kolts Посмотреть сообщение
Компилятор ругается, пишет, что нет такой функции.
. Проверьте тип параметра.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
24.07.2015, 21:18  [ТС] 8
Можно было в качестве параметра передавать указатель на функцию, но у меня три функции, поэтому придется передавать все три. Сейчас посмотрю как быстрее.
Я просто сам 1с-ник, а там вообще нет типов в классическом понимании поэтому немного тяжело переключиться.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2015, 21:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Неявное приведение указателей на классы
Всем привет! Обнаружилась вот такая нестыковочка: имеем интерфейсный класс IIn. И имеем...

Приведение типов умных указателей
Добрый день. Реализовал простенький умный указатель с подсчетом ссылок. template&lt;typename...

Объяснить, что происходит в коде (приведение одного типа указателей к другому?)
char* a = &quot;Hell&quot;; int* b =(int*) a; cout &lt;&lt; *b; Как я понимаю в этом кусочке кода происходит...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты,...


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

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

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