Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
1

Доступ к функции предка

09.02.2024, 12:45. Показов 2535. Ответов 18
Метки win7, xe7 (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такая конструкция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class TMyClass : public TAClass
{
private:
...
protected:
...
public:
...
}
 
class TAClass : public TBClass
{
private:
...
protected:
...
    virtual void __fastcall Func(int k);
public:
...
}
Как в TMyClass переопределить (подменить своей) функцию Func из TBClass?
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2024, 12:45
Ответы с готовыми решениями:

Как наладить доступ из потомка к свойствам предка?
public class MainActivity extends Activity {...

TreeView. Получить имя предка предка, выбрав потомка
Как получить имя предка в TreeView, при этом выбрав потомка?

Нестандартный вопрос.Как получить доступ к переменным функции из другой функции?
<?php declare(ticks=1); function tick_handler() { print_r($_GLOBALS);//Печатает все переменные...

this на div предка
Доброе время суток! Каким образом можно передать в onclick ссылки(a href) ссылку на родительский...

18
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
09.02.2024, 13:31 2
vlad2, например

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
class TBClass
{
};
 
class TAClass : public TBClass
{
public:
    virtual void Func(int k)
    {
    }
    
    virtual ~TAClass()=default;
};
 
class TMyClass : public TAClass
{
protected:
    void Func(int k)override
    {
    }
};
 
int main()
{
    TAClass* t=new TMyClass;
    t->Func(0);
    delete t;
}
Добавлено через 3 минуты
подправил
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
09.02.2024, 13:44  [ТС] 3
Спасибо, Алексей1153.
Прошу прощения, ошибся в коде, там сложнее. Надо так:
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
class TMyClass : public TAClass
{
private:
...
protected:
...
public:
...
}
 
class TAClass : public TBClass
{
private:
...
protected:
...
public:
...
}
 
class TBClass : public TCClass
{
private:
...
protected:
...
    virtual void __fastcall Func(int k);
public:
...
}
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
09.02.2024, 13:50 4
vlad2, а, ну тогда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
...
class TMyClass : public TAClass
{
public:
    void Func(int k)override
    {
    }
};
 
int main()
{
    TMyClass* t=new TMyClass;
    t->Func(0);
    delete t;
}
Добавлено через 45 секунд
только смысл я не понял
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
09.02.2024, 14:09  [ТС] 5
Причём доступа к TAClass и TBClass у меня нет.

Добавлено через 2 минуты
Алексей1153, т.е. у меня есть доступ к protected функции "деда", минуя "сына"?

Добавлено через 10 минут
Цитата Сообщение от Алексей1153 Посмотреть сообщение
только смысл я не понял
Дело в том, что мне нужно изменить вид компоненты. В моей старой версии RAD Studio я это делал без труда, т.к. Func была определёна в TAClass, а в поздней версии RAD - в TBClass. И делая то же самое, это перестало работать, т.е. Func, который я прописал в TMyClass - это не та функция, которая в TBClass.
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
09.02.2024, 14:18 6
vlad2,

вот так

C++
1
2
3
4
5
6
7
8
class TMyClass : public TAClass
{
public:
    void Func(int k)override
    {
        TAClass::Func(k);
    }
};
или так
C++
1
2
3
4
5
class TMyClass : public TAClass
{
public:
    using TAClass::Func;
};
Добавлено через 48 секунд
Цитата Сообщение от vlad2 Посмотреть сообщение
Дело в том, что мне нужно изменить вид компоненты
разработчики неспроста упрятали функцию. Думаю, менять её поведение не особо можно
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
09.02.2024, 16:12  [ТС] 7
Спасибо, Алексей1153, попробуем.
Но честно говоря, сомнения есть).

Добавлено через 1 час 36 минут
Не совсем понятно: если в *.h файле я объявляю, например,
C++
1
using TAClass::Func;
, то как написать тело функции с членами класса TMyClass в *.cpp файле? Т.е., например, объявление в файле MyClass.h, а описание - в MyClass.cpp.

Добавлено через 13 минут
А в теле этой функции использую приватные члены класса TMyClass.
Не приходилось сталкиваться с такой ситуацией.
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
09.02.2024, 17:48 8
vlad2, тело функции уже имеется - в предке. Это вкидывание функции предка в паблик
https://onlinegdb.com/ayZsJqruw
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
12.02.2024, 10:37  [ТС] 9
Алексей1153, мне нужно изменить код этой функции, т.е. подменить её на свою. И мой вопрос в том, как это сделать.
Когда было прямое наследование, то писал просто:
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
//  MyFile.h
class TMyClass : public TAClass
{
private:
...
protected:
...
    virtual void __fastcall Func(int k);
public:
...
}
 
//  MyFile.cpp
...
void __fastcall TMyClass::Func(int k)
{
   ...
}
...
 
//  AClass.hpp
class TAClass : public TCClass
{
private:
...
protected:
...
    virtual void __fastcall Func(int k);
public:
...
}
А здесь наследование через потомка. В итоге вопрос: могу ли я получить доступ к функции, не меняя кода TAClass?
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
12.02.2024, 12:49 10
Цитата Сообщение от vlad2 Посмотреть сообщение
могу ли я получить доступ к функции, не меняя кода TAClass?
унаследоваться от TAClass, в наследнике переопределить виртуальную функцию, а затем экземпляр наследника подсунуть вместо TAClass*
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
12.02.2024, 13:23  [ТС] 11
Алексей1153, видимо в моём случае, унаследоваться от TBClass и там переопределить виртуальную функцию? А как её потом переопределить в TAClass? Непонятно. В моём случае функция определена (или переопределена) в TBClass - предок TAClass. В TAClass она не переопределена.
А если унаследоваться от TBClass и от TAClass? Или это бессмысленно?
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
12.02.2024, 13:29 12
vlad2, так при чём тут TBClass ? Если вопрос про

Цитата Сообщение от vlad2 Посмотреть сообщение
могу ли я получить доступ к функции, не меняя кода TAClass?
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
12.02.2024, 13:32  [ТС] 13
Цитата Сообщение от Алексей1153 Посмотреть сообщение
vlad2, так при чём тут TBClass ? Если вопрос про
потому что функция определена в нём, а не в TAClass (см. #3).
Т.е. у меня такая цепочка: TBClass -> TAClass -> TMyClass. И мне надо переопределить функцию, которая теперь находится в TBClass, а не в TAClass, как раньше.
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
12.02.2024, 13:37 14
vlad2, так функция же виртуальная

есть класс TAClass. Где-то используется указатель на его экземпляр.

Делаем класс class X:public TAClass , где переопределяем функцию. И вместо экземпляра класса TAClass создаём экземпляр класса X , указатель на который используем где нужно.
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
12.02.2024, 14:11  [ТС] 15
Цитата Сообщение от Алексей1153 Посмотреть сообщение
есть класс TAClass. Где-то используется указатель на его экземпляр
Теоретически понятно, только нигде не использую напрямую указатель на экземпляр TAClass, использую только TMyClass*. Т.е. есть стандартная компонента TAClass, я на её базе создаю свою (TMyClass), которой пользуюсь.
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
13.02.2024, 10:47  [ТС] 16
Получается, подменить функцию через предка невозможно, если она не вынесена в предка.
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
13.02.2024, 10:55 17
vlad2, если это какой-то компонент на форме, то скорее всего, можно, но как это в билдере сделать - я не в курсе.

Например, в студии и QtCreator можно применить promotion - на форму кладётся стандартный компонент, затем в настройках указывается, какой производный класс для него реально использовать
0
5 / 5 / 2
Регистрация: 06.04.2011
Сообщений: 290
13.02.2024, 11:06  [ТС] 18
Алексей1153, да, это компонента на форме, и в новой версии её, похоже, придётся делать самому. Спасибо за помощь.
0
фрилансер
 Аватар для Алексей1153
5861 / 5400 / 1106
Регистрация: 11.10.2019
Сообщений: 14,432
13.02.2024, 11:29 19
Цитата Сообщение от vlad2 Посмотреть сообщение
придётся делать самому
глянь версию IDE и найди в тырнете, как промоутинг контролов делать
0
13.02.2024, 11:29
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2024, 11:29
Помогаю со студенческими работами здесь

Нахождение предка рекурсивно
Пишу под турбо-пролог. Первый день Есть задание найти рекурсивно предка. Деда, или прадеда......

процедура поиска предка
пример таблицы логического вывода для процедуры reverse и append в прикрепленном документе

Поиск предка и потомков
Написать программу, которая ищет заданную вершину в дереве и возвращает список, содержащий предка...

Шаблоны. Выбор предка
Задача: Научить класс, в зависимости от результата логического выражения, наследоваться то от...

Переопределение метода предка
Доброго времени суток. Возникла такая проблема: при вызове метода(Logic), который по разному...

Вызов методов предка
Привет! Подскажите, как в классе-потомке вызвать метод предка, например, если методы потомка и...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
Rust или Go? А может C++?
hw_wired 28.01.2025
С каждой новой технологией или методологией появляются новые языки программирования, призванные решать конкретные задачи либо улучшать аспекты производительности и безопасности. Среди множества. . .
Fortran и WinAPI: как создать приложение с графическим интерфейсом
hw_wired 28.01.2025
Fortran — это один из старейших высокоуровневых языков программирования, широко используемый в науке и инженерии уже несколько десятилетий. Его название происходит от "Formula Translation" (перевод. . .
Списки в Haskell
hw_wired 28.01.2025
Haskell является функциональным языком программирования, который отличается лаконичностью синтаксиса и мощными абстракциями. Важным концептом в Haskell являются списки — упорядоченные коллекции. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru