Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 3

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня есть два класса, базовый и производный. В производном классе я переопределяю два метода method1 и method2. В базовом классе method2 вызывает method1, в производном классе в реализации method2 я вызываю method2 базового класса. Вопрос, при вызове method2 производного класса приведет ли это к вызову переопределенного method1 из базового method2 или же все ограничится вызовом базового method1 ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2015, 23:37
Ответы с готовыми решениями:

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

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

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

8
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
04.01.2015, 23:57
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
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
05.01.2015, 10:32
Цитата Сообщение от tnk500 Посмотреть сообщение
Оба вывода покажут букву 'Z'.
Действительно, парадоксально.
Во втором случае - это ожидаемо, т.к. использован виртуальный механизм вызова
через указатель базового класса.
А вот в первом, совсем непонятно с какого перепоя?
Получается, что при написании методов базового класса надо пристально следить за вызовами
виртуальных функций и явно указывать имя класса!
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
05.01.2015, 10:56
Первый метод виртуальный, второй вызывает первый. Т.к. он виртуальный, то method2 обращается к таблице вирт. функций объекта. В обоих случаях это таблица производного класса. Уберите виртуальность первого метода, вызовется именно базовая функция.
0
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 3
05.01.2015, 12:42  [ТС]
Спасибо всем за рекомендации. Я понял, что стоит посмотреть в учебниках по C++ тему по виртуальным функциям.
0
Заблокирован
05.01.2015, 13:23
Цитата Сообщение от KKS_1977 Посмотреть сообщение
приведет ли это к вызову переопределенного method1 из базового method2
тут и без кода понятно, что приведет.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.01.2015, 13:53
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 3
06.01.2015, 19:04  [ТС]
У меня возник еще один вопрос: по делу ли здесь виртуальность второго метода в базовом классе ? Я вызываю method2 вторым (см. комментарий tnk500) способом, т.е. не через указатель, а явно через объект производного класса, мне здесь не нужен полиморфизм.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
06.01.2015, 19:57
KKS_1977, да, virtual можно убрать. Вывод будет одним и тем же.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.01.2015, 19:57
Помогаю со студенческими работами здесь

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

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

Вызов виртуального метода базового класса из указателя производного
Допустим есть такой код: #include &lt;iostream&gt; class Base { public: virtual void f() { std::cout &lt;&lt; &quot;Base\n&quot;; } ...

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru