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

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

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

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

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

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

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

4
3200 / 2012 / 345
Регистрация: 24.11.2012
Сообщений: 4,839
30.08.2014, 20:01 2
Во втором случае потеряли const
0
45 / 45 / 23
Регистрация: 14.04.2013
Сообщений: 188
30.08.2014, 20:14  [ТС] 3
Хм, просто С.Прата пишет, что Вместо того чтобы привести к появлению двух перегруженных версий функций, это переопределение скрывает версию базового класса. А на деле получается наоборот.
0
3200 / 2012 / 345
Регистрация: 24.11.2012
Сообщений: 4,839
30.08.2014, 20:19 4
Цитата Сообщение от Zazy Посмотреть сообщение
это переопределение скрывает версию базового класса
Это означает, что через объект класса B просто так нельзя будет вызвать константную версию A::f.
1
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.08.2014, 23:18 5
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2014, 23:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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