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

Почему нужно переопределять метод, для использования ?

24.10.2016, 22:03. Показов 1189. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет есть такой код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A {
    private: 
        int var;
    public:
                A() { var = 0 }
        int getVar() {
            return this->var;
        }
};
class B : A {
...
};
int _tmain() {
B * ex = new B();
B->getVar(); //error 
return 0;
}
Почему в классе B я не могу обратиться к публичному методу предка? приходиться переопределять метод тупым образом для использования :
C++
1
2
3
4
5
6
class B : A {
     public:
                int getVar() {
            return this->getVar();
        }
};
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2016, 22:03
Ответы с готовыми решениями:

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

Почему можно переопределять переменную в цикле?
привет. Привожу листинг из учебника. Это есть програмка для вывода меню на экран. Ненужные куски кода убрал. // ... int main() {...

Обязательно ли переопределять виртуальный метод в дочернем классе?
Вопрос: если в родительском классе определен и реализован виртуальный метод, обязательно переопределять его в дочернем? class OneTwo { ...

7
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
24.10.2016, 22:07
C++
1
class B : public A
И если уж надумал ПЕРЕОПРЕДЕЛЯТЬ/ПЕРЕГРУЖАТЬ методы предка, объявляй их в этом предке виртуальными (virtual int getVar).

PS
Мб, там все нормально, но на всякий случай:
C++
1
2
B* ex = new B();
ex->getVar(); // не B->...
1
0 / 0 / 2
Регистрация: 24.06.2012
Сообщений: 112
24.10.2016, 22:16  [ТС]
Писал от руки тут, поэтому написал не объект, а класс ...
все равно ошибка ... в том то и дело, я не горю желанием переопределять методы, но иначе объект потомка не хочет видеть публичный метод класса родителя. Хотя по сути при наследовании в потомка передаются все методы и свойства предка или я ошибаюсь ?
А зачем virtual ? так нельзя переопределять ? (на будущее)
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
24.10.2016, 22:25
Leffken,
у тебя тут
Цитата Сообщение от Leffken Посмотреть сообщение
C++
1
2
3
4
5
6
class B : A {
     public:
                int getVar() {
            return this->getVar();
        }
};
закрытое (приватное) наследование. Напиши так:
C++
1
2
3
4
class B : public A {
public:
//...
};
0
0 / 0 / 2
Регистрация: 24.06.2012
Сообщений: 112
24.10.2016, 22:29  [ТС]
Первый раз слышу что наследование может быть приватным или нет ... спасибо, заработало
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
24.10.2016, 22:34
Лучший ответ Сообщение было отмечено Leffken как решение

Решение

Цитата Сообщение от Leffken Посмотреть сообщение
Первый раз слышу что наследование может быть приватным или нет
В любой книжке есть.
Ну или здесь.
1
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
24.10.2016, 23:09
Цитата Сообщение от Leffken Посмотреть сообщение
так нельзя переопределять
Если будешь пользоваться указателями на объекты (точнее, указателями на базовый класс, а хранить объект класса-потомка), то в случае без virtual будет вызвано совсем не то, что ты ожидаешь.

Ну и в любом классе с виртуальными ф-ми надо виртуальным делать деструктор, но это уже другая история.

Цитата Сообщение от Leffken Посмотреть сообщение
Первый раз слышу что наследование может быть приватным или нет
Я тебе больше скажу - оно может быть и виртуальным) Но это редко применяют...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
25.10.2016, 19:18
Цитата Сообщение от Leffken Посмотреть сообщение
приходиться переопределять метод тупым образом для использовани
В ситуации, когда используется приватное наследование, но публичный доступ к методу через потомка все таки нужен, не нужно "переопределять метод тупым образом". Достаточно воспользоваться using-декларацией:

C++
1
2
3
4
class B : A {
public:
  using A::getVar;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2016, 19:18
Помогаю со студенческими работами здесь

Метод расширения для IEnumerable без использования Enumerator
Прохожу курс по C#, глава про IEnumerable, IEnumerator и yield. Пытаюсь выполнить задание в конце главы. Нужно реализовать метод...

Нужно получить переменную из поля для дальнейшего использования в скрипте
В поле x1 ввожу переменную, нужно ее получить, чтобы в скрипте в функции "смена" в зависимости от величины переменной (1,2 или 3 и...

Какие библиотеки нужно подключить для использования модального окна?
Добрый день Подскажите что нужно подключить для модального окна. Добавляю $modal в контроллер и ошибка ...

Нужно с ASP страницы открыть файл для использования на другой странице.
Mne nado s ASP stranitsi otkrit file dlya ispolzovaniya v drugoy ASP stranitsi. V amerikanskih Windows 2000NT okoshko nazivayetsa 'Choose...

БД: для уже имеющихся строк нужно вызывать метод Update, для остальных - Insert
Допустим, есть база данных, в которой есть таблица Table1, содержащая поле ID (первичный ключ), Name (уникальное поле), и какие-то другие...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.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 и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru