47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
1

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

30.08.2014, 19:58. Показов 1367. Ответов 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
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
30.08.2014, 20:01 2
Во втором случае потеряли const
0
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
30.08.2014, 20:14  [ТС] 3
Хм, просто С.Прата пишет, что Вместо того чтобы привести к появлению двух перегруженных версий функций, это переопределение скрывает версию базового класса. А на деле получается наоборот.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
30.08.2014, 20:19 4
Цитата Сообщение от Zazy Посмотреть сообщение
это переопределение скрывает версию базового класса
Это означает, что через объект класса B просто так нельзя будет вызвать константную версию A::f.
1
:)
Эксперт С++
4773 / 3267 / 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
30.08.2014, 23:18
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
Copyright ©2000 - 2023, CyberForum.ru