Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
#1

как сделать override метода - C++

09.09.2013, 17:36. Просмотров 1032. Ответов 8
Метки нет (Все метки)

пытаюсь сделать override метода в С++ классе, но не выходит. Вместо этого метод переопределяется полностью, не выполняет код родительского метода.
Что делаю не так?

заголовок классов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
#ifndef __c___console__test_override_classes__
#define __c___console__test_override_classes__
 
class FirstClass {
 
public:
    virtual void hellobase();
    virtual void hello1();
};
 
class SecondClass: public FirstClass {
    
public:
    virtual void hello1();
};
 
#endif
исполняемый код классов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "test_override_classes.h"
 
using namespace std;
 
void FirstClass::hello1() {
    cout << "hello FirstClass" << endl;
}
 
void FirstClass::hellobase() {
    cout << "hellobase FirstClass" << endl;
}
 
void SecondClass::hello1() {
    cout << "hello SecondClass" << endl;
}
консольное приложение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
 
#include "test_override_classes.h"
 
int main(int argc, const char * argv[])
{
    
    //FirstClass *fc = new FirstClass;
    //fc->hello1();
    
    SecondClass *sc = new SecondClass;
    
    sc->hellobase();
    sc->hello1();
    
    return 0;
}
ответ консоли

hellobase FirstClass
hello SecondClass
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2013, 17:36     как сделать override метода
Посмотрите здесь:

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

Чем отличается override от virtual? - C++
Так и не понял. Если указать метод как override, то он переопределит метод базового класса Для этого метод базового класса должен быть...

Warning: 'override' keyword is incompatible with C++98 [-Wc++98-compat] - C++
Как убрать этот warning? warning: 'override' keyword is incompatible with C++98

Как создать псевдоним метода - C++
Здравствуйте. Интересует можно ли создать в СИ++ для класса псевдоним метода? хочу сделать, чтобы эти две записи были равносильны...

Как вызвать из метода метод? - C++
Здравствуйте. Прошу Вас помочь. Как мне вызвать из метода Set метод Draw? Мне надо передать объект A в Draw (у которого есть координаты x и...

Как правильно вернуть итератор из метода - C++
Всем привет. Есть класс обертка над контейнером, который рулит некоторыми сущностями И понадобилось получать итераторы на эти сущности -...

Класс как аргумент своего же метода - C++
В примере ниже происходит лишний (по замыслу не нужный) вызов деструктора. Вопрос в следующем: как в методе класса в качестве аргумента...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
09.09.2013, 17:41     как сделать override метода #2
noname_club, Код родительского метода выполнится только в том случае, если его явно вызвать из метода потомка.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
09.09.2013, 17:45  [ТС]     как сделать override метода #3
нашел ошибку

дело в том что в С++ виртуальный метод вызывается как статический поэтому очень легко спутать его с вызовом статики

верный код с небольшой доработкой

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class FirstClass {
    
    
public:
    int hellovalue;
    
    virtual void hellobase();
    virtual void hello1();
};
 
class SecondClass: public FirstClass {
    
public:
    virtual void hello1();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "test_override_classes.h"
 
using namespace std;
 
void FirstClass::hello1() {
    cout << "hello FirstClass" << this->hellovalue << endl;
}
 
void FirstClass::hellobase() {
    cout << "hellobase FirstClass" << endl;
}
 
void SecondClass::hello1() {
    FirstClass::hello1(); // << вызов OVERRIDE похож на вызов статического метода
    cout << "hello SecondClass" << endl;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(int argc, const char * argv[])
{
    
    //FirstClass *fc = new FirstClass;
    //fc->hello1();
    
    SecondClass *sc = new SecondClass;
    
    sc->hellovalue = 12;
    
    sc->hellobase();
    sc->hello1();
    
    return 0;
}
hellobase FirstClass
hello FirstClass12
hello SecondClass
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
09.09.2013, 17:50     как сделать override метода #4
noname_club, Вы о чем вообще? override в С++ это просто указание, что переопределяется метод базового класса (и то с С++11, до того такого понятия впринципе не было). Вызов метода базового класса при перегрузке ну просто никак не должен происходить. Для конкретной задачи, конечно, вы справились верно, но тогда неверно задан вопрос.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
09.09.2013, 17:52  [ТС]     как сделать override метода #5
Вызов метода базового класса при перегрузке ну просто никак не должен происходить
путаете понятия. Перегрузка это overload

переопределение override
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
09.09.2013, 17:55     как сделать override метода #6
noname_club, Ну переопределении, ошибся конечно. В данном контексте это не играет роли, по дефолту вызов метода базового класса происходить не должен. Вызов конечно может пригодится, в частности в паттерне декоратор, но все же не настолько часто.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
09.09.2013, 18:03  [ТС]     как сделать override метода #7
ага, теперь все ясно

FirstClass::hello1(); в код выше тоже работает, только по причине того, что его область видимости совпадает с областью видимость более точного выражения выражения this->FirstClass::hello1() ;

хотя правильнее и однозначнее писать this->FirstClass::hello1() ;

вызов статики идет аналогично, через явное указание namespace

SecondClass::FirstClass::hello1();

Добавлено через 1 минуту
Вызов конечно может пригодится
незнаю как в c++ а других языках override явление очень частое
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
09.09.2013, 18:24     как сделать override метода #8
noname_club, override отнюдь не подразумевает вызова метода базового класса. Это просто переопределение функции базового класса, не более того.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 18:27     как сделать override метода
Еще ссылки по теме:

Аргументы шаблонного метода как объекты - C++
Не могу решить одну задачу. вот три класса class win {}; class obj1 {}; class obj2 {};

Функция как параметр метода класса - C++
Есть класс с таким методом: void SGraph::DrawGraphPixels(float func) /* ! Сюда надо передать какую либо математическую функцию */ { ...

Функция как аргумент шаблонного метода класса - C++
Пытаюсь передать функцию для сравнения в сортировке слиянием, но что-то не получается. Подскажите, как исправить этот код, чтобы сортировка...

Как можно использовать фактический параметр у метода? - C++
ситуация примерно такая: class A { int a; public : int get_a() { return a; } };

Как обратиться к компоненте формы из метода класса? - C++
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {//компонента формы EndingOrder close; ...


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

Или воспользуйтесь поиском по форуму:
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
09.09.2013, 18:27  [ТС]     как сделать override метода #9
естественно. Выбор вызывать или не вызывать this->FirstClass::hello1() зависит от конкретной задачи.

override отнюдь не подразумевает
он дает выбор дописать функцию родителя или полностью написать свою
Yandex
Объявления
09.09.2013, 18:27     как сделать override метода
Ответ Создать тему
Опции темы

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