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

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

Восстановить пароль Регистрация
 
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
09.09.2013, 17:36     как сделать override метода #1
пытаюсь сделать 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.09.2013, 17:41     как сделать override метода #2
noname_club, Код родительского метода выполнится только в том случае, если его явно вызвать из метода потомка.
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.09.2013, 17:50     как сделать override метода #4
noname_club, Вы о чем вообще? override в С++ это просто указание, что переопределяется метод базового класса (и то с С++11, до того такого понятия впринципе не было). Вызов метода базового класса при перегрузке ну просто никак не должен происходить. Для конкретной задачи, конечно, вы справились верно, но тогда неверно задан вопрос.
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
09.09.2013, 17:52  [ТС]     как сделать override метода #5
Вызов метода базового класса при перегрузке ну просто никак не должен происходить
путаете понятия. Перегрузка это overload

переопределение override
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.09.2013, 17:55     как сделать override метода #6
noname_club, Ну переопределении, ошибся конечно. В данном контексте это не играет роли, по дефолту вызов метода базового класса происходить не должен. Вызов конечно может пригодится, в частности в паттерне декоратор, но все же не настолько часто.
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
09.09.2013, 18:03  [ТС]     как сделать override метода #7
ага, теперь все ясно

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

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

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

SecondClass::FirstClass::hello1();

Добавлено через 1 минуту
Вызов конечно может пригодится
незнаю как в c++ а других языках override явление очень частое
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++ Как повысить точность программы на основе метода половинного деления?
Как реализовать вне класса тело метода? C++
Как вызвать из метода метод? C++

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

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

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

Текущее время: 05:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru