Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
KKS_1977
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 3
1

Вызов переопределенного метода из методов базового класса

04.01.2015, 23:37. Просмотров 1777. Ответов 8
Метки нет (Все метки)

Здравствуйте, у меня есть два класса, базовый и производный. В производном классе я переопределяю два метода method1 и method2. В базовом классе method2 вызывает method1, в производном классе в реализации method2 я вызываю method2 базового класса. Вопрос, при вызове method2 производного класса приведет ли это к вызову переопределенного method1 из базового method2 или же все ограничится вызовом базового method1 ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2015, 23:37
Ответы с готовыми решениями:

Вызов методов производного класса из базового
Возможно ли, чтобы class A { void f1() { f2();//если вызвано из B, то...

Вызов наследуемых методов из базового класса
Всем доброго времени суток, перейду сразу к сути. Код: class Base { ...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать...

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

В производном классе вызов приватного метода базового класса
Добрый вечер. Помогите понять одну вещь. Имеется такое наследование: class...

8
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
04.01.2015, 23:57 2
KKS_1977, интересный вопрос, во всяком случае я думал, что верно последнее. Как оказалось, нет.
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
#include <iostream>
 
class Foo
{
public:
    virtual void method1()
    {
        std::cout << "A\n";
    }
    virtual void method2()
    {
        method1();
    }
};
 
class Fooo : public Foo
{
public:
    void method1()
    {
        std::cout << "Z\n";
    }
    void method2()
    {
        Foo::method2();
    }
};
 
int main()
{
    Foo First, *Second;
    Fooo Third;
    Second = &Third;
    Third.method2();
    Second->method2();
    system("pause");
}
Оба вывода покажут букву 'Z'.

Не по теме:

Честно говоря, смахивает на UB немножк



Добавлено через 2 минуты
А вот если специфицировать вызов функции method1() из класса Foo
C++
1
Foo::method1();
то вызываться будет функция из класса Foo.
2
zss
Модератор
Эксперт С++
7178 / 6677 / 4226
Регистрация: 18.12.2011
Сообщений: 17,618
Завершенные тесты: 1
05.01.2015, 10:32 3
Цитата Сообщение от tnk500 Посмотреть сообщение
Оба вывода покажут букву 'Z'.
Действительно, парадоксально.
Во втором случае - это ожидаемо, т.к. использован виртуальный механизм вызова
через указатель базового класса.
А вот в первом, совсем непонятно с какого перепоя?
Получается, что при написании методов базового класса надо пристально следить за вызовами
виртуальных функций и явно указывать имя класса!
0
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
05.01.2015, 10:56 4
Первый метод виртуальный, второй вызывает первый. Т.к. он виртуальный, то method2 обращается к таблице вирт. функций объекта. В обоих случаях это таблица производного класса. Уберите виртуальность первого метода, вызовется именно базовая функция.
0
KKS_1977
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 3
05.01.2015, 12:42  [ТС] 5
Спасибо всем за рекомендации. Я понял, что стоит посмотреть в учебниках по C++ тему по виртуальным функциям.
0
Xelort
Заблокирован
05.01.2015, 13:23 6
Цитата Сообщение от KKS_1977 Посмотреть сообщение
приведет ли это к вызову переопределенного method1 из базового method2
тут и без кода понятно, что приведет.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.01.2015, 13:53 7
Цитата Сообщение от zss Посмотреть сообщение
А вот в первом, совсем непонятно с какого перепоя?
Разбираем:
C++
1
2
Fooo Third; // объект производного класса
Third.method2(); // вызов method2() производного класса. Стоит отметить, что тут никаких полиморфных вызовов нет, т.к. используется сам объект (Third), а не указатель или ссылка.
Дальше, в методе производного класса:
C++
1
2
3
4
void method2()
{
   Foo::method2(); // вызывается method2() из базового класса, т.к. явно указан класс Foo.
}
В базовом классе:
C++
1
2
3
4
virtual void method2() 
{ 
   method1(); // Вызывается виртуальный метод. 
}
Возвращаясь по цепочке вызовов, вспоминаем, что объект для которого вызывается метод относится к производному классу (Fooo). Таким образом, в данном случае (из-за виртуальности) будет вызван метод класса Fooo, который в свою очередь выведет букву "Z".
3
KKS_1977
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 3
06.01.2015, 19:04  [ТС] 8
У меня возник еще один вопрос: по делу ли здесь виртуальность второго метода в базовом классе ? Я вызываю method2 вторым (см. комментарий tnk500) способом, т.е. не через указатель, а явно через объект производного класса, мне здесь не нужен полиморфизм.
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
06.01.2015, 19:57 9
KKS_1977, да, virtual можно убрать. Вывод будет одним и тем же.
1
06.01.2015, 19:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2015, 19:57

Вызов виртуального метода базового класса из указателя производного
Допустим есть такой код: #include &lt;iostream&gt; class Base { public:...

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

Вызов объектом базового класса функцию из производного класса!
Как можно осуществить вызов или передачу значения в базовый класс для...


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

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

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