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

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

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

Студворк — интернет-сервис помощи студентам
Есть такая конструкция:
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);//Печатает все переменные в области видимости кода вне функции...

18
фрилансер
 Аватар для Алексей1153
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,048
09.02.2024, 13:31
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
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313
09.02.2024, 13:44  [ТС]
Спасибо, Алексей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
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,048
09.02.2024, 13:50
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
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313
09.02.2024, 14:09  [ТС]
Причём доступа к TAClass и TBClass у меня нет.

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

Добавлено через 10 минут
Цитата Сообщение от Алексей1153 Посмотреть сообщение
только смысл я не понял
Дело в том, что мне нужно изменить вид компоненты. В моей старой версии RAD Studio я это делал без труда, т.к. Func была определёна в TAClass, а в поздней версии RAD - в TBClass. И делая то же самое, это перестало работать, т.е. Func, который я прописал в TMyClass - это не та функция, которая в TBClass.
0
фрилансер
 Аватар для Алексей1153
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,048
09.02.2024, 14:18
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
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313
09.02.2024, 16:12  [ТС]
Спасибо, Алексей1153, попробуем.
Но честно говоря, сомнения есть).

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

Добавлено через 13 минут
А в теле этой функции использую приватные члены класса TMyClass.
Не приходилось сталкиваться с такой ситуацией.
0
фрилансер
 Аватар для Алексей1153
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,048
09.02.2024, 17:48
vlad2, тело функции уже имеется - в предке. Это вкидывание функции предка в паблик
https://onlinegdb.com/ayZsJqruw
0
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313
12.02.2024, 10:37  [ТС]
Алексей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
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,048
12.02.2024, 12:49
Цитата Сообщение от vlad2 Посмотреть сообщение
могу ли я получить доступ к функции, не меняя кода TAClass?
унаследоваться от TAClass, в наследнике переопределить виртуальную функцию, а затем экземпляр наследника подсунуть вместо TAClass*
0
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313
12.02.2024, 13:23  [ТС]
Алексей1153, видимо в моём случае, унаследоваться от TBClass и там переопределить виртуальную функцию? А как её потом переопределить в TAClass? Непонятно. В моём случае функция определена (или переопределена) в TBClass - предок TAClass. В TAClass она не переопределена.
А если унаследоваться от TBClass и от TAClass? Или это бессмысленно?
0
фрилансер
 Аватар для Алексей1153
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,048
12.02.2024, 13:29
vlad2, так при чём тут TBClass ? Если вопрос про

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

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

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

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru