Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
1

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

31.07.2015, 21:10. Просмотров 531. Ответов 13
Метки нет (Все метки)

Может мне стоит книжку почитать или получше подумать над структурой, но вопрос вот:
Есть у нас древо классов:
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(); }

Но могут быть и другие способы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 21:10
Ответы с готовыми решениями:

Наследование методов C++
Подскажите, если у меня есть класс, в нём описан метод добавления элемента...

Наследование, и перегрузки методов
Вопрос: есть ли какие нибудь красивые решения данной проблемы? Рассмотрим...

Наследование методов класса
Я пишу программу на наследование классов.Базовый - Person , с объектами имя ,...

Наследование параметризованных методов
Всем привет! Нигде не могу найти правильный синтаксис для такой ситуации....

Наследование и перегрузка методов
Здравствуйте. Пытаюсь выполнить упр. 8 из главы 11 книги Р.Лафоре "ООП в С++",...

13
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
31.07.2015, 21:24 2
Eraston, переопределять что-то нужно тогда, когда действительно нужно переопределить. Функция сохраняет свой вид в производном классе, если в нем она не определена заново. Так что можете просто не указывать функцию в s3 and s4. Она сохранится
0
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
31.07.2015, 21:34  [ТС] 3
Она сохранится от родителя. у s3 и s4 будет метод s2::f(), а надо base::f();

Грубо говоря, есть у меня функция непереопределяемая SetParametr(), которую используют все наследники. Внутри SetParametr вызывается функция Refresh() (которая должна быть у всех наследников, чтобы её можно было использовать в SetParametr). А функция Refresh только должна обновить некоторые данные, при том, что обновление данных в последующих наследниках может не требоваться.
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
31.07.2015, 21:49 4
UPD: прошу прощения, вы сами ответили на вопрос.
0
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
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
>
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
31.07.2015, 22:30 6
Eraston, в конце первого сообщения. Я невнимательно сообщение прочел. Насчет других способов, честно говоря, не знаю, но по-моему это довольно удобный способ. Ну если хотите - вызывайте функции так:
C++
1
2
3
A* ptr = new C;
ptr->A::f();   // здесь вернет 1, как в базовом
ptr->f();   //   а вот здесь - два
0
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
31.07.2015, 23:26  [ТС] 7
Цитата Сообщение от tnk500 Посмотреть сообщение
1
2
3
A* ptr = new C;
ptr->A::f(); * // здесь вернет 1, как в базовом
ptr->f(); * // * а вот здесь - два
Это целевой вызов метода, а виртуальные методы вызываются у всех сподряд.

Цитата Сообщение от tnk500 Посмотреть сообщение
Насчет других способов, честно говоря, не знаю, но по-моему это довольно удобный способ.
Удобный, для одного случая.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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();
}
0
Робинзон2
0 / 0 / 0
Регистрация: 31.07.2015
Сообщений: 2
31.07.2015, 23:54 9
есть еще идеи?
0
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
01.08.2015, 00:15  [ТС] 10
Tulosba,
Цитата Сообщение от Eraston Посмотреть сообщение
Как вариант: переопределить обратно virtual void s3::f(){ base::f(); }
Но могут быть и другие способы?
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
01.08.2015, 00:27 11
Eraston, что значит "для одного случая"? Довольно логично ведь. Если наследуете класс от другого, который в свою очередь унаследован от самого первого, последний производный должен иметь больше общего со своим "отцом", чем со своим "дедушкой". Это в большинстве случаев. В других случаях достаточно вновь переопределить функцию, что вы и высказали.
0
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
01.08.2015, 00:33  [ТС] 12
tnk500, последний произвольный вполне имеет больше общего с отцом, кроме одной функции.

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

Не по теме:

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

А еще можно не обозначать функцию как виртуальную, и просто написать в base f1(), a в s2 — f2(). Конечно, обе функции будут наследоваться, но ведь это лучше двух ненужных классов?
0
Eraston
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
01.08.2015, 12:30  [ТС] 14
Цитата Сообщение от Eraston Посмотреть сообщение
Грубо говоря, есть у меня функция непереопределяемая SetParametr(), которую используют все наследники. Внутри SetParametr вызывается функция Refresh() (которая должна быть у всех наследников, чтобы её можно было использовать в SetParametr). А функция Refresh только должна обновить некоторые данные, при том, что обновление данных в последующих наследниках может не требоваться.
Внимательно.
0
01.08.2015, 12:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 12:30

Наследование классов. Конфликт методов
Здравствуйте! Проблема следующая. Написал операции постфиксной и префиксной...

ООП. Наследование переменных и методов от Базового класса к Дочернему и наоборот
class Money : { public: int Selection() { //Здесь играет роль...

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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