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

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

07.08.2015, 09:17. Показов 1111. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2015, 09:17
Ответы с готовыми решениями:

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

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

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

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

4
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
07.08.2015, 09:30 2
Лучший ответ Сообщение было отмечено 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
шКодер самоучка
2145 / 1856 / 907
Регистрация: 09.10.2013
Сообщений: 4,056
Записей в блоге: 7
07.08.2015, 09:32 3
Лучший ответ Сообщение было отмечено 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
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
07.08.2015, 09:39 4
Лучший ответ Сообщение было отмечено kquick как решение

Решение

Не успел добавить.
using Parent::foo; - самый лучший выход из ситуации на мой взгляд.
1
kquick
11.08.2015, 17:41  [ТС]     Как вернуть функцию, которая потерялась при наследовании классов?
  #5
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2015, 17:41

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

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

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

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

Ошибка в наследовании: как вызвать функции дочерних классов
Всем привет. Есть такой учебный код: abstract class A { int a1; virtual void Print(); } class...

Как вернуть тему, которая была при первом запуске kde?
На работе обновили систему. Теперь стоит KDE-3.5. Полез настраивать темы. Все, что нашёл,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru