Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
6 / 6 / 5
Регистрация: 15.05.2014
Сообщений: 104

Как вернуть функцию, которая потерялась при наследовании классов?

07.08.2015, 09:17. Показов 1490. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предположим есть два класса:
C++
1
2
3
4
5
6
7
8
9
10
11
class Parent
{
public:
    void foo() { std::cout << "parent foo " << std::endl; }
};
 
class Child : public Parent
{
public:
    void foo(int num) { std::cout << "child foo " << std::endl; }
};
В дочернем классе мы определяем собственную функцию foo с аргументом. В этом случае доступ к функции foo без аргументов родительского класса теряется. Как в этом случае вернуть её, чтобы вызывать обе функции как одну перегруженную, то есть чтобы работал такой код:

C++
1
2
3
Child child;
child.foo();
child.foo(1);
Идеи:
1)
Мы можем делать это для конструкторов
C++
1
void Child() : Parent()
Может быть есть какой-нибудь похожий синтаксис для вызова функций, чтобы код в дочернем классе наподобии такого работал?
C++
1
2
void foo() : Parent::foo() {}
void foo(int num) { std::cout << "child foo " << std::endl; }
2)
Можно объявить класс Parent приватным в классе Child. Далее в Child определить свои перегруженные методы и в соответствующих методах класса Child вызывать методы класса Parent. Но в этом случае теряется наследование. И вообще, я считаю это не удачной затеей.

3)
Обявить свою функцию foo() в Child и скопировать код из Parent(не всегда возможно, например, private члены в Parent). Тоже не очень затея (антипаттерн дублирование кода).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.08.2015, 09:17
Ответы с готовыми решениями:

Указатели при наследовании классов
Здравствуйте , заданием было реализовать однонаправленный список как класс и затем используя механизм наследования создать базу данных на...

Ошибка компиляции при наследовании классов
У меня есть класс CNew который наследует класс CTransport но при компиляции выводит ошибку ниже 4 раза для 2 строки файла CNew.h .Мне не...

Выделение памяти при наследовании классов
Здравствуйте! У меня есть метод который, читает память занимаемую классом. Есть несколько базовых классов и два наследуемых класса -...

4
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.08.2015, 09:30
Лучший ответ Сообщение было отмечено kquick как решение

Решение

C++
1
2
3
    Child child;
    child.Parent::foo();
    child.foo(1);
Ну или так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class Parent
{
public:
    void foo() { std::cout << "parent foo " << std::endl; }
};
 
class Child : public Parent
{
public:
    void foo() { Parent::foo(); }
    void foo(int num) { std::cout << "child foo " << std::endl; }
};
 
int main() {
    Child child;
    //child.Parent::foo();
    child.foo();
    child.foo(1);
}
2
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
07.08.2015, 09:32
Лучший ответ Сообщение было отмечено kquick как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
class Parent
{
public:
    void foo() { std::cout << "parent foo " << std::endl; }
};
 
class Child : public Parent
{
public:
    using Parent::foo;
    void foo(int num) { std::cout << "child foo " << std::endl; }
};
 
int main() {
    Child child;
    child.foo();
    child.foo(1);
    return 0;
}
2
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.08.2015, 09:39
Лучший ответ Сообщение было отмечено kquick как решение

Решение

Не успел добавить.
using Parent::foo; - самый лучший выход из ситуации на мой взгляд.
1
11.08.2015, 17:41  [ТС]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.08.2015, 17:41
Помогаю со студенческими работами здесь

Что происходит при наследовании классов?
Гуглил тут одну тему про наследование и коде встретилась строчка: D d; Что в ней конкретно происходит ? или как это называется ? ...

Ошибка при наследовании интерфейса в библиотеке классов
В решении два проекта. Один - библиотека классов, другой консольный, который с этой библиотекой работает. В одном из классов библиотеки, в...

Ошибка Type missmatch при наследовании классов
При создании объекта класса Chord появляется ошибка: E2356 Type mismatch in redeclaration of '__stdcall Chord(void...

Не могу разобраться с выводом данных при наследовании классов
using System; namespace pr_konstr { class Voin { private string Name; private int Age; ...

Как создать функцию которая возвращает переменную одного из классов?
Программа пишется в с++ builder 6. Есть несколько классов: class Diggitt{ int l; } class One: public Diggitt{ int...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru