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

Наследование методов - C++

Восстановить пароль Регистрация
 
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
31.07.2015, 21:10     Наследование методов #1
Может мне стоит книжку почитать или получше подумать над структурой, но вопрос вот:
Есть у нас древо классов:
base > s2 > s3 > s4 > ...
И есть в base virtual void f(){ _act1_ }
А в s2 virtual void f(){ _act2_ }
А в s3 должен обратно быть метод base::virtual void f(){ _act1_ }
И чтобы s4 также использовал base::virtual void f(){ _act1_ }

Т.е. переопределение виртуального должно работать только для s2.
Как вариант: переопределить обратно virtual void s3::f(){ base::f(); }

Но могут быть и другие способы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,216
Завершенные тесты: 3
31.07.2015, 21:24     Наследование методов #2
Eraston, переопределять что-то нужно тогда, когда действительно нужно переопределить. Функция сохраняет свой вид в производном классе, если в нем она не определена заново. Так что можете просто не указывать функцию в s3 and s4. Она сохранится
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
31.07.2015, 21:34  [ТС]     Наследование методов #3
Она сохранится от родителя. у s3 и s4 будет метод s2::f(), а надо base::f();

Грубо говоря, есть у меня функция непереопределяемая SetParametr(), которую используют все наследники. Внутри SetParametr вызывается функция Refresh() (которая должна быть у всех наследников, чтобы её можно было использовать в SetParametr). А функция Refresh только должна обновить некоторые данные, при том, что обновление данных в последующих наследниках может не требоваться.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,216
Завершенные тесты: 3
31.07.2015, 21:49     Наследование методов #4
UPD: прошу прощения, вы сами ответили на вопрос.
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
31.07.2015, 22:23  [ТС]     Наследование методов #5
tnk500, где?

Добавлено через 10 минут
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
30
31
32
class we1{
public:
    we1():a(4),b(8){};
    virtual void f(){ a++; refresh(); cout << a << "\n"; }
    virtual void refresh(){};
protected:
    int a;
    int b;
};
class we2: public we1{
public:
    we2():c(3){};
protected:
    int c;
private:
    virtual void refresh(){ a += 10; };
};
class we3: public we2{
public:
    we3():d(9){};
protected:
    int d;
    //virtual void refresh(){};
};
//...
            we3 *a = new we3;
            we2 *c = new we2;
            we1 *b = a;
            we1 *b2 = c;
            b2->f();
            b->f();
//...
out> we
15
15
>
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,216
Завершенные тесты: 3
31.07.2015, 22:30     Наследование методов #6
Eraston, в конце первого сообщения. Я невнимательно сообщение прочел. Насчет других способов, честно говоря, не знаю, но по-моему это довольно удобный способ. Ну если хотите - вызывайте функции так:
C++
1
2
3
A* ptr = new C;
ptr->A::f();   // здесь вернет 1, как в базовом
ptr->f();   //   а вот здесь - два
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
31.07.2015, 23:26  [ТС]     Наследование методов #7
Цитата Сообщение от tnk500 Посмотреть сообщение
1
2
3
A* ptr = new C;
ptr->A::f(); * // здесь вернет 1, как в базовом
ptr->f(); * // * а вот здесь - два
Это целевой вызов метода, а виртуальные методы вызываются у всех сподряд.

Цитата Сообщение от tnk500 Посмотреть сообщение
Насчет других способов, честно говоря, не знаю, но по-моему это довольно удобный способ.
Удобный, для одного случая.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.07.2015, 23:30     Наследование методов #8
Цитата Сообщение от Eraston Посмотреть сообщение
у s3 и s4 будет метод s2::f(), а надо base::f();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
struct s1 {
    virtual void f() const { std::cout << "1\n"; }
};
 
struct s2 : s1 {
    virtual void f() const override { std::cout << "2\n"; }
};
 
struct s3 : s2 {
    virtual void f() const override { s1::f(); }
};
 
 
int main() {
    
    s1* s = new s3();
    s->f();
}
Робинзон2
0 / 0 / 0
Регистрация: 31.07.2015
Сообщений: 2
31.07.2015, 23:54     Наследование методов #9
есть еще идеи?
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 00:15  [ТС]     Наследование методов #10
Tulosba,
Цитата Сообщение от Eraston Посмотреть сообщение
Как вариант: переопределить обратно virtual void s3::f(){ base::f(); }
Но могут быть и другие способы?
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,216
Завершенные тесты: 3
01.08.2015, 00:27     Наследование методов #11
Eraston, что значит "для одного случая"? Довольно логично ведь. Если наследуете класс от другого, который в свою очередь унаследован от самого первого, последний производный должен иметь больше общего со своим "отцом", чем со своим "дедушкой". Это в большинстве случаев. В других случаях достаточно вновь переопределить функцию, что вы и высказали.
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 00:33  [ТС]     Наследование методов #12
tnk500, последний произвольный вполне имеет больше общего с отцом, кроме одной функции.

Можно, конечно, так поизвращаться:
Миниатюры
Наследование методов  
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,216
Завершенные тесты: 3
01.08.2015, 08:27     Наследование методов #13

Не по теме:

Eraston, два ненужных класса ради одной функции? А вы знаете толк в извращениях.

А еще можно не обозначать функцию как виртуальную, и просто написать в base f1(), a в s2 — f2(). Конечно, обе функции будут наследоваться, но ведь это лучше двух ненужных классов?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 12:30     Наследование методов
Еще ссылки по теме:

C++ Создание методов в С++
Наследование параметризованных методов C++
Переопределение методов C++

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

Или воспользуйтесь поиском по форуму:
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 12:30  [ТС]     Наследование методов #14
Цитата Сообщение от Eraston Посмотреть сообщение
Грубо говоря, есть у меня функция непереопределяемая SetParametr(), которую используют все наследники. Внутри SetParametr вызывается функция Refresh() (которая должна быть у всех наследников, чтобы её можно было использовать в SetParametr). А функция Refresh только должна обновить некоторые данные, при том, что обновление данных в последующих наследниках может не требоваться.
Внимательно.
Yandex
Объявления
01.08.2015, 12:30     Наследование методов
Ответ Создать тему
Опции темы

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