Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для Zazy
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188

Почему при переопределении виртуального метода в производном классе выводится метод базового?

30.08.2014, 19:58. Показов 2298. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добра!
Помогите разобраться почему при переопределении виртуального метода в производном классе выводится метод базового ?
По идеи я ведь делаю переопределение в производном классе и базовый метод должен скрыться.
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
#include <iostream>
 
class A
{
    int a;
public:
    A(int a_ = 0) : a(a_) {};
    virtual void print() const { std::cout << a << std::endl; };
 
};
 
class B : public A
{
public:
    B() : b(10) {};
    virtual void print() { std::cout << b << std::endl; }
 
private:
    int b;
};
 
int main()
{
    B b;
    A *a = &b;
    a->print();
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.08.2014, 19:58
Ответы с готовыми решениями:

Почему при множественном наследовании в производном классе оказывется несколько экземпляров общего базового класса
Я не очень хорошо знаю плюсы, но я разбираюсь. Учусь, и мне хотелось бы иногда получать ответы на глупые мои вопросы. Кто может помочь? ...

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

Вычислить косинус матрицы в производном классе с помощью перегруженных операций из базового
Писал тут задание с наследованием и перегрузкой и столкнулся с интересной проблемой, может кто из профи поможет. #include...

4
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
30.08.2014, 20:01
Во втором случае потеряли const
0
 Аватар для Zazy
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
30.08.2014, 20:14  [ТС]
Хм, просто С.Прата пишет, что Вместо того чтобы привести к появлению двух перегруженных версий функций, это переопределение скрывает версию базового класса. А на деле получается наоборот.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
30.08.2014, 20:19
Цитата Сообщение от Zazy Посмотреть сообщение
это переопределение скрывает версию базового класса
Это означает, что через объект класса B просто так нельзя будет вызвать константную версию A::f.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.08.2014, 23:18
Цитата Сообщение от Zazy Посмотреть сообщение
при переопределении виртуального метода в производном классе выводится метод базового
Тут нет переопределения виртуального метода базового класса в производном.

Например, если Ваш компилятор поддерживает C++11, попробуйте 16 строку написать так:
C++
1
virtual void print() override { std::cout << b << std::endl; } //явное указание о переопределении виртуального метода
И увидите характерную ошибку:
error: ‘virtual void B::print()’ marked override, but does not override
Происходит это потому, что константность функции входит в ее сигнатуру, т.е.
C++
1
2
void f() const;
void f();
Это разные функции-члены.

Для Вашего примера можно вообще убрать virtual и результат не изменится. Т.к. в классе B нет функции, которая переопределяла бы функцию из класса A. Чтобы это случилось, надо добавить в B соответствующую реализацию:
C++
1
virtual void print() const { std::cout << "b const" << std::endl; }
Ну, а если нужно чтобы работал такой вариант:
C++
1
2
const B b1;
b1.print();
То достаточно добавить в класс B видимость функции из A:
C++
1
using A::print;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2014, 23:18
Помогаю со студенческими работами здесь

Как сделать компоненты базового класса доступными в производном классе, но недоступными вне классов?
Как сделать компоненты базового класса доступными в производном классе, но недоступными вне классов?

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

Создайте в производном классе метод, определяющий формулу, которая изображена на рисунке
Создайте в производном классе метод, определяющий:формулу(изображена на рисунке 1)

Использование указателя на метод вместо виртуального метода
Имеется базовый класс Base. Имеется производный от Base класс Derived. В классе Derived требуется выполнить некоторое действие, которое...

Ошибка при вызове виртуальной функции в производном классе
Здравствуйте, извините, если подобная тема появлялась, но либо у меня руки не от туда растут, либо ее небыло... проблема в следующем:...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 25.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 23.01.2026
Решили писать научную статью с неким РОманом
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 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru